main.lua 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "modbus_slave_tcp"
  3. VERSION = "1.0.0"
  4. log.style(1)
  5. log.info("main", PROJECT, VERSION)
  6. -- sys库是标配
  7. _G.sys = require("sys")
  8. _G.sysplus = require("sysplus")
  9. -- 开启调试模式
  10. modbus.debug(1)
  11. -- -- 关闭调试模式
  12. -- modbus.debug(0)
  13. log.info("ch390", "打开LDO供电")
  14. gpio.setup(140, 1) --打开开发板lan供电
  15. require "lan"
  16. -- 创建从站设备,可选择RTU、ASCII、TCP,此demo仅用作测试TCP。设置该从站端口号为6000,网卡适配器序列号为socket.LWIP_ETH。
  17. local slave_id = 1
  18. mb_tcp_s = modbus.create_slave(modbus.MODBUS_TCP, slave_id, 6000, socket.LWIP_ETH)
  19. -- 创建寄存器数据区
  20. registers = zbuff.create(1)
  21. modbus.add_block(mb_tcp_s, modbus.REGISTERS, 0, 32, registers)
  22. registers:clear()
  23. -- 创建线圈数据区
  24. ciols = zbuff.create(1)
  25. modbus.add_block(mb_tcp_s, modbus.CIOLS, 0, 32, ciols)
  26. ciols:clear()
  27. -- 启动modbus从站
  28. modbus.slave_start(mb_tcp_s)
  29. log.info("start modbus slave")
  30. local counter = 0
  31. -- 修改和读取modbus值
  32. function modify_data()
  33. counter = counter + 1
  34. -- 写入寄存器数据 (16位无符号整数)
  35. registers:seek(0)
  36. for i=0,31 do
  37. registers:writeU16((counter + i) % 65536) -- 写入递增数字,限制在0-65535
  38. end
  39. -- 写入线圈数据 (1位布尔值)
  40. ciols:seek(0)
  41. for i=0,31 do
  42. ciols:writeU8((counter + i) % 2) -- 交替写入0和1
  43. end
  44. -- 读取并打印部分数据用于调试
  45. registers:seek(0)
  46. ciols:seek(0)
  47. log.info("registers:", registers:readU16(), registers:readU16(), registers:readU16(), registers:readU16(), registers:readU16())
  48. log.info("ciols :", ciols:readU8(), ciols:readU8(), ciols:readU8(), ciols:readU8(), ciols:readU8())
  49. end
  50. sys.timerLoopStart(modify_data,1000)
  51. -- -- 测试停止modbus从站,从站将在开启两分钟后关闭
  52. -- sys.timerStart(function()
  53. -- modbus.slave_stop(mb_rtu_s)
  54. -- log.info("Modbus", "2分钟时间到,停止Modbus从站")
  55. -- end, 120000)
  56. -- 用户代码已结束---------------------------------------------
  57. -- 结尾总是这一句
  58. sys.run()
  59. -- sys.run()之后后面不要加任何语句!!!!!