跳到主要内容

通信模块

插件可作为主/从站,支持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. 绑定只读寄存器
    寄存器值改变会调用功能码执行对应逻辑
  2. 绑定只写寄存器
    执行功能码函数,写入寄存器中。
    可实现自定义寄存器通信功能。

使用例子:

//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设置好从站,即可在从站对应的数据位看到数据。
从站数据1
从站数据2