PLC和Modbus协议

版权声明:一辈子做程序员有何不可? https://blog.csdn.net/yoyo18520/article/details/78986627

由于工作的原因,一直在研究和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,有兴趣的可以下载看看。

猜你喜欢

转载自blog.csdn.net/yoyo18520/article/details/78986627