由于工作的原因,一直在研究和PLC通讯的事情。我们采购的是三菱5u的PLC,内置网口,最开始用的是三菱的SLMP协议的,但是我真的是太懒了,感觉自己解析报文协议太麻烦,各种转换都太浪费精力了。偶然的一次机会,和安川PLC通讯,走了一回Modbus TCP协议,然后就欲罢不能,简直是太方便了。
我用的是开源libmodbus库,自己编译了一下,生成动态库之后调用起来毫无压力。
我也找了一些C#版本的,easyModbus,看起来也还不错。
可以参考参考别人的翻译啥的。
// 初始化Modbus
// 1.Modbus TCP方式
modbus_t * _ctx = modbus_new_tcp("192.168.0.1", 8000);
modbus_set_slave(_ctx, SERVER_ID);
if (modbus_connect(_ctx) == -1)
{
fprintf(stderr, "Unable to create the libmodbus context\n");
modbus_free(_ctx);
}
// 2.Modbus RTU串口方式
_ctx= modbus_new_rtu("\\\\.\\COM8", 115200, 'N', 8, 1);
if (ctx == NULL)
{
fprintf(stderr, "Unable to create the libmodbus context\n");
return -1;
}
// 读取一个寄存器的值
uint16_t * tab_reg = NULL;
tab_reg = (uint16_t *)malloc(MODBUS_REGISTER * sizeof(uint16_t));
memset(tab_reg, 0, MODBUS_REGISTER * sizeof(uint16_t));
int rc = modbus_read_registers(m_ctx, nRegisterID, MODBUS_REGISTER, tab_reg);
if (rc == -1)
{
free(tab_reg);
m_strErr = CString(modbus_strerror(errno));
return false;
}
nValue = int(*tab_reg);
free(tab_reg);
我把自己编译好的Modbus库放在 https://gitee.com/luutry/resource.git,有兴趣的可以下载看看。