main.lua 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "modbus_slave_ascii"
  3. VERSION = "1.0.0"
  4. log.style(1)
  5. log.info("main", PROJECT, VERSION)
  6. -- 引入必要的库文件(lua编写), 内部库不需要require
  7. sys = require("sys")
  8. --初始化通讯串口
  9. local uartid = 1 -- 根据实际设备选取不同的uartid
  10. local uart485Pin = 24 -- 用于控制485接收和发送的使能引脚
  11. gpio.setup(1, 1) --打开电源(开发板485供电脚是gpio1,用开发板测试需要开机初始化拉高gpio1)
  12. uart.setup(uartid, 9600, 8, 1, uart.NONE, uart.LSB, 1024, uart485Pin, 0, 2000)
  13. -- 创建从站设备,此demo用作测试ASCII。
  14. local slave_id = 1
  15. mb_ascii_s = modbus.create_slave(modbus.MODBUS_ASCII, slave_id, uartid)
  16. -- 添加一块寄存器内存区
  17. registers = zbuff.create(1)
  18. modbus.add_block(mb_ascii_s, modbus.REGISTERS, 0, 32, registers)
  19. registers:clear()
  20. -- 创建线圈数据区
  21. ciols = zbuff.create(1)
  22. modbus.add_block(mb_ascii_s, modbus.CIOLS, 0, 32, ciols)
  23. ciols:clear()
  24. -- 启动modbus从站
  25. modbus.slave_start(mb_ascii_s)
  26. local counter = 0
  27. -- 修改和读取modbus值
  28. function modify_data()
  29. counter = counter + 1
  30. -- 写入寄存器数据 (16位无符号整数)
  31. registers:seek(0)
  32. for i=0,31 do
  33. registers:writeU16((counter + i) % 65536) -- 写入递增数字,限制在0-65535
  34. end
  35. -- 写入线圈数据 (1位布尔值)
  36. ciols:seek(0)
  37. for i=0,31 do
  38. ciols:writeU8((counter + i) % 2) -- 交替写入0和1
  39. end
  40. -- 读取并打印部分数据用于调试
  41. registers:seek(0)
  42. ciols:seek(0)
  43. log.info("registers:", registers:readU16(), registers:readU16(), registers:readU16(), registers:readU16(), registers:readU16())
  44. log.info("ciols :", ciols:readU8(), ciols:readU8(), ciols:readU8(), ciols:readU8(), ciols:readU8())
  45. end
  46. sys.timerLoopStart(modify_data,1000)
  47. -- -- 测试停止modbus从站,将在从站启动两分钟后关闭
  48. -- sys.timerStart(function()
  49. -- modbus.slave_stop(mb_ascii_s)
  50. -- log.info("Modbus", "2分钟时间到,停止Modbus从站")
  51. -- end, 2 * 60 * 1000) -- 2分钟(单位:毫秒)
  52. -- 用户代码已结束---------------------------------------------
  53. -- 结尾总是这一句
  54. sys.run()
  55. -- sys.run()之后后面不要加任何语句!!!!!