通信模块
插件可作为主/从站,支持modbus等协议类型,可用来控制激光器,末端电爪,焊机等

Ethercat通信
通过接口读取和控制从站。
用户可继承EcatBaseAPI基类,在launch中初始化。
配置好相应的硬件连接和对应的数据地址
调用SetPdoValue等相应的api接口,即可实现。
使用例子:
#include "ehtercat/ecat_base_api.hpp"
class WeldingMachine:public xcore_api::ecat::EcatBaseAPI{
public:
WeldingMachine(int slave_id):xcore_api::ecat::EcatBaseAPI(slave_id){
RegisterVolPdo();
}
virtual ~WeldingMachine(){}
bool Init(){
return InitEcat();
}
int RegisterVolPdo(){
uint16_t index = 0;
uint16_t byteoffs = 4;
uint16_t bytelen = 4;
//数据赋值给m_pdo_vol
return RegisterPdo(m_pdo_vol,index,byteoffs,bytelen);
}
int SetVol(const int vol){
int value = vol;
return SetPdoValue(m_pdo_vol,&value);
}
private:
xecat::PdoAPI m_pdo_vol;
}
//使用接口设置电压
int slave_id = 10;
WeldingMachine obj(slave_id);
if(obj->Init()){
obj->SetVol(10);
};
模拟量通信
通过接口读取和设置IO信号,寄存器值等。
#include "io/analog_api.hpp"
auto ptr = xcore_api::io::Analog::getInstance();
ptr->SetDOValue("DO0_1",false);
ptr->WriteBoolRegister("regname",true,0);
寄存器功能码
可实现自定义功能码:
在插件中使用功能码API,声明功能码并注册即可在HMI功能码列表中显示。

- 绑定只读寄存器
寄存器值改变会调用功能码执行对应逻辑 - 绑定只写寄存器
执行功能码函数,写入寄存器中。
可实现自定义寄存器通信功能。
使用例子:
//1 声明功能码类
DECLARE_FUNCTION_CODE_API(PluginReadReg);
/**
* @brief 实现功能码类
*/
FUNCTION_CODE_EXECUTE_API(PluginReadReg){
std::vector<int> v;
ReadIntRegValue(v);
std::string str;
for(auto &item:v){
str += std::to_string(item) + ",";
}
LOG_INFO<<"PluginReadReg:"<<str;
return true;
}
/**
* @brief 创建功能码实例
*/
std::shared_ptr<xreg::FuncCodeAPI> makeReadRegCmd(){
xreg::FuncCodeCfgAPI cfg;
cfg.SetName("plugin_read_reg_cmd");
cfg.SetSupportType({xreg::RegTypeAPI::BIT,xreg::RegTypeAPI::BOOL,xreg::RegTypeAPI::BYTE,xre g::RegTypeAPI::INT16,xreg::RegTypeAPI::INT32});
cfg.SetLen(1);
cfg.SetWriteable(false);
return std::make_shared<PluginReadReg>(cfg);
}
//4 在初始化阶段将能码类注册到控制系统中
xreg::RegFuncCodeAPI(makeReadRegCmd());
示例:



modbus通信
以modbus tcp主站为例:
void ModbusExample() {
std::thread t([](){
using namespace xcore_api::fieldbus;
ModbusCfgAPI cfg(DeviceTypeAPI::MODBUS_TCP_MASTER);
cfg.SetName("plugin_master");
//设置为自己从站的ip
cfg.SetIp("192.168.2.213");
//如果从站不支持读线圈等操作则设置为0,否则可能影响功能
cfg.SetCoilsNum(0);
cfg.SetDiscInputNum(0);
FieldbusAPI api(cfg);
int i = 0;
uint16_t src[10] = {0};
uint16_t dest[10] = {0};
api.Open();
while(1){
++i;
int rc = api.ReadRegisters(40000, dest) ;
LOG_DEBUG<<"read registers:"<<rc<< " read value:"<<dest[0];
++src[0];
rc = api.WriteRegisters(40005, src);
LOG_DEBUG<<"write registers:"<<rc<<" write value: "<<src[0];
std::this_thread::sleep_for(std::chrono::seconds(10));
}
api.Close();
});
t.detach();
}
使用modbus slave设置好从站,即可在从站对应的数据位看到数据。

