mirror of
https://gitee.com/js-yhsec/energy_storage.git
synced 2026-05-27 18:59:26 +08:00
175 lines
6.3 KiB
C
175 lines
6.3 KiB
C
|
|
/***************************************************************************
|
|||
|
|
rlcanopen.cpp - description
|
|||
|
|
-------------------
|
|||
|
|
begin : Tue March 03 2004
|
|||
|
|
copyright : (C) 2004 by Marc Br<EFBFBD>tigam, Christian Wilmes, R. Lehrig
|
|||
|
|
email : lehrig@t-online.de
|
|||
|
|
***************************************************************************/
|
|||
|
|
|
|||
|
|
/***************************************************************************
|
|||
|
|
* *
|
|||
|
|
* This library is free software; you can redistribute it and/or modify *
|
|||
|
|
* it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as *
|
|||
|
|
* published by the Free Software Foundation *
|
|||
|
|
* *
|
|||
|
|
***************************************************************************/
|
|||
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <sys/types.h>
|
|||
|
|
#include <unistd.h>
|
|||
|
|
#include "rlsocket.h"
|
|||
|
|
#include "rlthread.h"
|
|||
|
|
#include "rlcutil.h"
|
|||
|
|
#include "rlwthread.h"
|
|||
|
|
|
|||
|
|
#include "rlcanopentypes.h"
|
|||
|
|
|
|||
|
|
//! Class performs API rlcanopen functions remotely through tcp sockets
|
|||
|
|
/*! this class provides the client API funcions which should be
|
|||
|
|
similar to the rlcanopen API.
|
|||
|
|
Main difference is that underlying code does not communicate with
|
|||
|
|
the canopen device itself but with a rlcanopendaemon, which should
|
|||
|
|
run in backbround or on an remote computer. */
|
|||
|
|
|
|||
|
|
class rlCanOpenClient
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
enum rl_msg {
|
|||
|
|
MSG_SEND = 0,
|
|||
|
|
MSG_RECEIVE = 1,
|
|||
|
|
MSG_SDO_READ = 0,
|
|||
|
|
MSG_SDO_WRITE = 1,
|
|||
|
|
MSG_PDO_RECEIVE = 3,
|
|||
|
|
MSG_CONNECT = 5,
|
|||
|
|
MSG_DISCONNECT = 6,
|
|||
|
|
MSG_PDO_TRANSMIT = 4,
|
|||
|
|
MSG_NMT_TRANSMIT = 7,
|
|||
|
|
MSG_RESTART_BOARD = 8,
|
|||
|
|
MSG_GET_NODE_STATE = 9
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//! initializes the client on localhost port 5000
|
|||
|
|
rlCanOpenClient();
|
|||
|
|
//! initializes the client on given port and remove server adress
|
|||
|
|
rlCanOpenClient(int _port, char* _remoteadress);
|
|||
|
|
//! destructor disconnects client
|
|||
|
|
~rlCanOpenClient();
|
|||
|
|
//! opens a new connection to a running rlCanOpenDaemon
|
|||
|
|
int connect();
|
|||
|
|
//! disconnects from daemon
|
|||
|
|
int disconnect();
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*! using the sdo_read function you can read a certain object from the
|
|||
|
|
object dictionary of a node.
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _sdo_data.get_rlmsgerr() */
|
|||
|
|
int sdo_read( int _boardnr,
|
|||
|
|
int _nodeid,int _objectindex,
|
|||
|
|
int _subindex,
|
|||
|
|
rlCanOpenTypes &_sdo_data);
|
|||
|
|
|
|||
|
|
/*! using the sdo_write function you can write to a certain object
|
|||
|
|
from the object dictionary of a node
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _sdo_data.get_rlmsgerr() */
|
|||
|
|
int sdo_write(int _boardnr,
|
|||
|
|
int _nodeid,int _objectindex,
|
|||
|
|
int _subindex,
|
|||
|
|
rlCanOpenTypes &_sdo_data);
|
|||
|
|
|
|||
|
|
/*! receives single mapped pdo object from daemon.
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _sdo_data.get_rlmsgerr() */
|
|||
|
|
int pdo_receive(int _boardnr,
|
|||
|
|
int _nodeid,int _pdonr,
|
|||
|
|
int _mappingnr,
|
|||
|
|
rlCanOpenTypes &_pdo_data);
|
|||
|
|
|
|||
|
|
/*! receives an 8 byte pdo from daemon.
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _sdo_data.get_rlmsgerr() */
|
|||
|
|
int pdo_receive(int _boardnr,
|
|||
|
|
int _nodeid,int _pdonr,
|
|||
|
|
rlCanOpenTypes &_pdo_data);
|
|||
|
|
|
|||
|
|
/*! sends a single mapped pdo object to daemon.
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _pdo_data.get_rlmsgerr() */
|
|||
|
|
int pdo_transmit(int _boardnr,
|
|||
|
|
int _nodeid,int _pdonr,
|
|||
|
|
int _mappingnr,
|
|||
|
|
rlCanOpenTypes &_pdo_data);
|
|||
|
|
|
|||
|
|
/*! sends an 8 byte pdo to daemon.
|
|||
|
|
Function will return NULL if connection to daemon broke down.
|
|||
|
|
CanOpen interface related errors are
|
|||
|
|
accessable in _pdo_data.get_rlmsgerr() */
|
|||
|
|
int pdo_transmit(int _boardnr,
|
|||
|
|
int _nodeid,
|
|||
|
|
int _pdonr,
|
|||
|
|
rlCanOpenTypes &_pdo_data);
|
|||
|
|
|
|||
|
|
/*! sends a NMT command to daemon. */
|
|||
|
|
int sendNMTCommand( int _boardnr,
|
|||
|
|
int _nodeid,
|
|||
|
|
unsigned char _cmd,
|
|||
|
|
bool &returnstate);
|
|||
|
|
|
|||
|
|
/*! forces daemon to restart canopen device. */
|
|||
|
|
int restartBoard(int _boardnr, int _restarttype, bool &returnstate);
|
|||
|
|
|
|||
|
|
/*! receives node state data of particular node from daemon. */
|
|||
|
|
int getNodeState(int _boardnr, int _nodeid,rlCanOpenTypes &_data);
|
|||
|
|
|
|||
|
|
//! setter for private port variable
|
|||
|
|
void setPort(int _port);
|
|||
|
|
|
|||
|
|
//! setter for private remoteadress variable
|
|||
|
|
void setAdr(char* _adr);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
//! variable contains process id
|
|||
|
|
int pid;
|
|||
|
|
|
|||
|
|
//! flag indicates connection status
|
|||
|
|
bool connected;
|
|||
|
|
|
|||
|
|
//! variable contains port
|
|||
|
|
int port;
|
|||
|
|
|
|||
|
|
//! string of remoteadress
|
|||
|
|
char remoteadress[40];
|
|||
|
|
|
|||
|
|
//! pointer to socket object
|
|||
|
|
rlSocket* socket;
|
|||
|
|
//! timeout in ms
|
|||
|
|
int client_timeout;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//#####################################################################################
|
|||
|
|
// convenience class for client users
|
|||
|
|
class rlCanClient : public rlCanOpenClient
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
rlCanClient(int _port, char* _remoteadress, int _boardnr);
|
|||
|
|
~rlCanClient();
|
|||
|
|
int sdo_read(int _nodeid, int _objectindex, int _subindex, rlCanOpenTypes &_sdo_data);
|
|||
|
|
int sdo_write(int _nodeid,int _objectindex, int _subindex, rlCanOpenTypes &_sdo_data);
|
|||
|
|
int pdo_receive(int _nodeid, int _pdonr, int _mappingnr, rlCanOpenTypes &_pdo_data);
|
|||
|
|
int pdo_receive(int _nodeid, int _pdonr, rlCanOpenTypes &_pdo_data);
|
|||
|
|
int pdo_transmit(int _nodeid, int _pdonr, int _mappingnr, rlCanOpenTypes &_pdo_data);
|
|||
|
|
int pdo_transmit(int _nodeid, int _pdonr, rlCanOpenTypes &_pdo_data);
|
|||
|
|
int sendNMTCommand(int _nodeid, unsigned char _cmd, bool &returnstate);
|
|||
|
|
int restartBoard(int _restarttype, bool &returnstate);
|
|||
|
|
int getNodeState(int _nodeid, rlCanOpenTypes &_data);
|
|||
|
|
private:
|
|||
|
|
int boardnr;
|
|||
|
|
};
|