PLC和Modbus协议

由于工作的原因,一直在研究和PLC通讯的事情。我们采购的是三菱5u的PLC,内置网口,最开始用的是三菱的SLMP协议的,但是我真的是太懒了,感觉自己解析报文协议太麻烦,各种转换都太浪费精力了。偶然的一次机会,和安川PLC通讯,走了一回Modbus TCP协议,然后就欲罢不能,简直是太方便了。

我用的是开源libmodbus库,自己编译了一下,生成动态库之后调用起来毫无压力。

我也找了一些C#版本的,easyModbus,看起来也还不错。

可以参考参考别人的翻译啥的。

[cpp]  view plain  copy
  1. // 初始化Modbus  
  2. // 1.Modbus TCP方式  
  3. modbus_t * _ctx = modbus_new_tcp("192.168.0.1", 8000);  
  4. modbus_set_slave(_ctx, SERVER_ID);  
  5. if (modbus_connect(_ctx) == -1)  
  6. {  
  7.     fprintf(stderr, "Unable to create the libmodbus context\n");  
  8.     modbus_free(_ctx);  
  9. }  
  10.   
  11. // 2.Modbus RTU串口方式  
  12. _ctx= modbus_new_rtu("\\\\.\\COM8", 115200, 'N', 8, 1);  
  13. if (ctx == NULL)  
  14. {  
  15.     fprintf(stderr, "Unable to create the libmodbus context\n");  
  16.     return -1;  
  17. }  
  18.   
  19. // 读取一个寄存器的值  
  20. uint16_t * tab_reg = NULL;  
  21. tab_reg = (uint16_t *)malloc(MODBUS_REGISTER * sizeof(uint16_t));  
  22. memset(tab_reg, 0, MODBUS_REGISTER * sizeof(uint16_t));  
  23. int rc = modbus_read_registers(m_ctx, nRegisterID, MODBUS_REGISTER, tab_reg);  
  24. if (rc == -1)  
  25. {  
  26.     free(tab_reg);  
  27.     m_strErr = CString(modbus_strerror(errno));  
  28.     return false;  
  29. }  
  30. nValue = int(*tab_reg);  
  31. free(tab_reg);  

我把自己编译好的Modbus库放在 https://gitee.com/luutry/resource.git ,有兴趣的可以下载看看。

你可能感兴趣的:(Modbus)