当前位置:   article > 正文

C++vs2013 + Modbus通讯协议 实现与PLC通讯_汇川modbus和c++通讯

汇川modbus和c++通讯

一、环境说明

        开发环境:vs2013、qt5.8.0、Libmodbus库

        开发语言:C++

二、框架搭建

        项目属性内分别引入modbus.dll、modbus.h、modbus-tcp.h、modbus.lib等头文件、动态库、静态库。具体操作与引入位置参考第一篇博客。

        注意64位与32位系统、debug模式与release模式下分别对应不同的引入文件。

三、测试例程

        程序中引入头文件 #include "modbus.h"

        1.建立PLC连接

  1. void pcPLC::connect()
  2. {
  3. std::cout << "modbus init success" << std::endl;
  4. // 设置PLC的IP地址与端口,建立TCP连接
  5. ctx = modbus_new_tcp("192.168.1.1", 502);
  6. if (ctx == NULL)
  7. {
  8. std::cout << "Unable to allocate libmodbus context " << modbus_strerror(errno) << std::endl;
  9. }
  10. std::cout << "modbus_connect(ctx) = " << modbus_connect(ctx) << std::endl;
  11. if (modbus_connect(ctx) == -1)
  12. {
  13. modbus_close(ctx);
  14. modbus_free(ctx);
  15. std::cout << "PLC connect failed " << modbus_strerror(errno) << std::endl;
  16. }
  17. else
  18. {
  19. std::cout << "PLC connect success " << std::endl;
  20. plcFlag = 1;
  21. }
  22. }

        2.读取寄存器数据

  1. int pcPLC::readRegister(int num)
  2. {
  3. uint16_t regs[1];
  4. if (plcFlag != 0)
  5. {
  6. int res = modbus_read_registers(ctx, num, 1, regs);
  7. if (res == -1)
  8. {
  9. std::cerr << "Failed to read registers: " << modbus_strerror(errno) << std::endl;
  10. // 读取失败返回值0x0000
  11. regs[0] = 0x0000;
  12. }
  13. else
  14. {
  15. //std::cout << "Read Register " << num << " : " << regs[0] << std::endl;
  16. }
  17. }
  18. // 返回读取值
  19. return regs[0];
  20. }

        3.数据写入寄存器

  1. void pcPLC::writeRegister( int num, int value)
  2. {
  3. if (plcFlag != 0)
  4. {
  5. if (modbus_write_register(ctx, num, value) == -1)
  6. {
  7. std::cerr << "Failed to write to register: " << modbus_strerror(errno) << std::endl;
  8. }
  9. else
  10. {
  11. //std::cout << "Changed Register " << num << " to : " << value << std::endl;
  12. }
  13. }
  14. }

        4.断开PLC连接

  1. void pcPLC::disconnect()
  2. {
  3. if (plcFlag != 0)
  4. {
  5. modbus_close(ctx);
  6. modbus_free(ctx);
  7. plcFlag = 0;
  8. std::cout << "PLC disconnect success " << std::endl;
  9. }
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/559245
推荐阅读
相关标签
  

闽ICP备14008679号