硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8415|回复: 24
收起左侧

[Lua] LUA脚本快速上手资源汇总

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2019-10-26 07:46:52 | 显示全部楼层 |阅读模式
2020-08-22补充:
H7-TOOL的LUA脚本学习流程(2020-06-06)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98111



LUA方面的书籍还不少,但看书效率有点低,可以考虑直接看网上的在线资源,之前学习html,ajax,JavaScript就直接看这些在线资源。

简单上手足够用了。
官方上手说明:
http://www.lua.org/start.html

国内网上资源做的也非常不错
https://www.runoob.com/lua/lua-tutorial.html
https://www.w3cschool.cn/lua/

1.jpg
2.jpg






回复

使用道具 举报

1

主题

369

回帖

372

积分

高级会员

积分
372
发表于 2019-10-26 10:39:41 | 显示全部楼层
太棒了。一直没对lua下手,这次h7-tool是个好机会
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2019-10-26 10:57:52 | 显示全部楼层
安装个LUA5.3,共计407个API,查阅更加方便些:
1.jpg
QQ截图20191026105752.jpg

回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2019-10-28 09:00:03 | 显示全部楼层
趁着H7-TOOL出来,学下lua。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
发表于 2019-12-3 14:34:55 | 显示全部楼层
你好,请问lua在开发中怎么使用呢?有例子么?
回复

使用道具 举报

3

主题

1223

回帖

1232

积分

至尊会员

积分
1232
发表于 2019-12-3 17:10:08 | 显示全部楼层
LUA这玩意是怎么跟嵌入式的系统交互的,有什么介绍的资料吗?比如,如何移植Lua到stm32f4, or  stm32h7? 等等
回复

使用道具 举报

17

主题

101

回帖

152

积分

初级会员

积分
152
发表于 2019-12-4 11:07:57 | 显示全部楼层
morning_enr6U 发表于 2019-12-3 17:10
LUA这玩意是怎么跟嵌入式的系统交互的,有什么介绍的资料吗?比如,如何移植Lua到stm32f4, or  stm32h7?  ...

这个问题百度都可以知道,只要系统具备通信功能,就可以将lua脚本传输单片机,然后解析运行,移植问题,百度一堆。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2019-12-17 09:42:46 | 显示全部楼层
fjt131543789 发表于 2019-12-3 14:34
你好,请问lua在开发中怎么使用呢?有例子么?

有,H7-TOOL上位机已经集成了一些
QQ截图20191217094823.jpg
回复

使用道具 举报

5

主题

87

回帖

102

积分

初级会员

积分
102
发表于 2020-3-23 14:31:02 | 显示全部楼层
为什么要用LUA,没看懂这个小程序的具体功能,是为了单纯的学习LUA吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2020-3-23 14:42:43 | 显示全部楼层
游在云间 发表于 2020-3-23 14:31
为什么要用LUA,没看懂这个小程序的具体功能,是为了单纯的学习LUA吗?

LUA的最大优势就是用户无需更新自己Flash里面已经存储的程序,直接在现有程序的基础上就可以实现各种应用功能。

比如H7-TOOL的脱机烧录更新新器件支持,不同系列,不同厂家的读写擦除方式,flash保护等都有所不同,通过lua可以方便的对单一系列做更新支持,用户不用频繁更新程序固件就可以实现。

H7-TOOL还很多地方用LUA。

回复

使用道具 举报

73

主题

1194

回帖

1413

积分

至尊会员

积分
1413
发表于 2020-8-21 22:55:01 | 显示全部楼层
lua的安装豹可以镜像下吗,官网下载很慢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2020-8-22 08:09:42 | 显示全部楼层
wdliming 发表于 2020-8-21 22:55
lua的安装豹可以镜像下吗,官网下载很慢

好的。
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2021-9-12 10:25:19 | 显示全部楼层
eric2013 发表于 2020-3-23 14:42
LUA的最大优势就是用户无需更新自己Flash里面已经存储的程序,直接在现有程序的基础上就可以实现各种应用 ...

硬汉,用lua是动态改变Flash里面代码的一些运行参数以实现不用硬件的适配吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2021-9-13 01:21:23 | 显示全部楼层
庄永 发表于 2021-9-12 10:25
硬汉,用lua是动态改变Flash里面代码的一些运行参数以实现不用硬件的适配吗?

不是改变Flash代码,是注册好各种API,LUA使用这些API做的功能,就像手机APP编程一样,都是在系统支持的各种API基础上做的应用程序一样,LUA也是这样的。
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2021-9-13 22:02:13 | 显示全部楼层
eric2013 发表于 2021-9-13 01:21
不是改变Flash代码,是注册好各种API,LUA使用这些API做的功能,就像手机APP编程一样,都是在系统支持的 ...

明白了,这样的话感觉工程师自己也能实现,相比之下lua有什么优势呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2021-9-14 08:19:56 | 显示全部楼层
庄永 发表于 2021-9-13 22:02
明白了,这样的话感觉工程师自己也能实现,相比之下lua有什么优势呢?

自己搞,简单玩一些特定功能是可以的,稍复杂点的就不行了,需要做编程语言解析,难点就在这个地方。

比这段代码解析下,而且这个解析要在芯片端来做。

  1. --F01=测试RC602,AutoTestRC608(8)
  2. --F02=识别+测试602,AutoDetect()
  3. --F03=RC402 校准+检测, AutoCalibTest()
  4. --F04=RC402 校准模拟量,Calib402()
  5. --F05=RC402 自动检测,AutoTestRC202()
  6. --F06=RC402 配置为0-20mA,ConfigChanRange(0)
  7. --F07=RC402 配置0-10V,ConfigChanRange(1)

  8. --xF05=读6通道模拟量,ReadAllChan(0)
  9. --xF07=设置通道1电压,SetCh1VoltMV(5000)
  10. --xF08=设置通道2电压,SetCh2VoltMV(10000)
  11. --xF09=设置通道1电流,SetCh1CurrMA(4.0)
  12. --xF10=设置通道2电流,SetCh2CurrMA(19.0)
  13. --xF11=读NTC温度,ReadTemp()

  14. --xF13=测试0-10V线性度,TestChVolt(1)
  15. --xF14=测试0-20mA线性度,TestChCurr(1)

  16. print("无线IO模块程序已加载V1.1")

  17. local Addr485 = 1
  18. local COMx = 1
  19. local TimeOut = 1000
  20. local RC604Addr        = 250
  21. local RC302Addr        = 251

  22. local RC202_NORMAL        = 0xC202
  23. local RD202_20MA    = 0x202A
  24. local RD202_18B20   = 0x202B
  25. local RD202_PULSE        = 0x202C

  26. local REG03_AO_VOLT_01 = 0x0420                --RC302 V1输出电压 mV
  27. local REG03_AO_CURR_01 = 0x0440                --RC302 输出电流 uA

  28. local CALIB_VOTL1 = 4000                --500mV  校准电压1
  29. local CALIB_VOTL2 = 9500        --95000mV 校准电压2

  30. local CALIB_CURR1 = 4000        --4mA  校准电流1
  31. local CALIB_CURR2 = 19000        --19mA 校准电流2

  32. local REG06_CALIB_KEY = 0x2FF0                --校准开关。写入 0x55AA 允许写校准参数。其他值禁止写入
  33. local REG06_CALIB_SET_RANGE = 0x2FF1                --临时设置模拟通道量程档位, 高字节通道号,低字节是档位

  34. local CALIB_REG_STEP         = 0x100           --通道寄存器步距
  35. local RANGE_REG_STEP         = 12                --量程寄存器步距
  36. local REG03_CC01_K0         = 0x3000        --通道1 电压第1档  K值
  37.         local CC01_K_0                 = 0                --K值
  38.         local CC01_B_0                 = 2                --B值
  39.         local CC01_T_5K_0         = 4                --校准时常温温度值 - NTC上拉电阻
  40.         local CC01_COEF_K_0 = 6                --温度补偿系数K
  41.         local CC01_COEF_B_0 = 8                --温度补偿系数B
  42.         local CC01_ZERO_ADC_0 = 10                --输入悬空ADC

  43.         local CC01_K_1                 = 12                --K值
  44.         local CC01_B_1                 = 14                --B值
  45.         local CC01_T_5K_1         = 16                --校准时常温温度值
  46.         local CC01_COEF_K_1         = 18                --校准时满位ADC
  47.         local CC01_COEF_B_1         = 20                --温度系数 0=不修正
  48.         local CC01_ZERO_ADC_1 = 22                --输入悬空ADC

  49. local REG03_CC02_K0        = 0x3100                --通道2 电压第1档  K值

  50. --
  51. --模拟通道修正后的值 output , int32 形式. 32个通道,共64个寄存器
  52. local REG04_CH01_OUT_I = 0x0010                --通道1-32 输出值,有符号32位整数,高2字节在前,2个寄存器

  53. --模拟通道修正后的值 output , float 形式. 32个通道,共64个寄存器
  54. local REG04_CH01_OUT_F = 0x0050                --通道1-32 输出值,浮点数,高2字节在前,2个寄存器

  55. --通道1 - 8 ADC值 有效值
  56. local REG04_CH01_ADC_RMS = 0x0090                --通道1-32 ADC值(NTC是均值,交流电流时RMS值), 浮点数,高2字节在前,2个寄存器

  57. --通道1 - 8 测得数据值的float形式
  58. local REG04_CH01_VALUE        = 0x00D0                --通道1-32 测量值(电阻 电压 电流),浮点数,高2字节在前,2个寄存器

  59. local REG04_CH01_ADC_AVG = 0x0110                --通道1-32 ADC均值

  60. local REG04_CH01_SIGNAL_TYPE = 0x0150                --通道1-32 信号类型(连续分配,方便读取),高字节bit0表示启用 禁用,低字节表示类型


  61. local REG03_CF01_EN = 0x2000                --通道使能 0表示不使能  1表示使能
  62.         local CF01_EN                        = 0x00                --通道使能 0表示不使能  1表示使能
  63.         local CF01_SIGN_TYPE                = 0x01                --(保留)输入信号类型 统一编码 (电流,电压,热电阻)
  64.         local CF01_FILT_MODE                = 0x02                --滤波模式 0 保留不用
  65.         local CF01_FILT_TIME                = 0x03                --滤波时间 单位0.1s
  66.         local CF01_CORR_K                        = 0x04                --线性修正 y=kx+b 之k, 浮点数,4字节
  67.         local CF01_CORR_B                        = 0x06                --线性修正 y=kx+b 之b, 浮点数,4字节
  68.         local CF01_LIMIT_LOWER        = 0x08                --量程下限,浮点数
  69.         local CF01_LIMIT_UPPER        = 0x0A                --量程上限,浮点数
  70.         local CF01_CUTOFF                        = 0x0C                --小信号切除万分比  .*/
  71.         local CF01_ALARM_EN                = 0x0D                --报警使能 1表示使能 0 禁止
  72.         local CF01_ALARM_LOWER        = 0x0E                --报警下限 浮点数
  73.         local CF01_ALARM_UPPER        = 0x10                --报警上限
  74.         local CF01_ALARM_BACK                = 0x12                --报警回差 浮点数
  75.         local CF01_ALARM_ACTION        = 0x14                --报警时设置 Y1-Y24 哪个继电器状态为1。允许多个通道映射到一个继电器输出(总报警标记)*/
  76.         local CF01_TEMP_CORR                = 0x15                --热电偶冷端温度修正。 有符号16bit整数 0.1摄氏度


  77. uart_cfg(COMx, 9600, 0, 8, 1)
  78. beep()

  79. --失败
  80. function PrintError(void)
  81.         print("-------测试失败----------")
  82.         beep(5,5,3)
  83. end

  84. --成功
  85. function PrintOk(void)
  86.         print("-------测试成功----------")
  87.         beep()
  88. end

  89. --自动校准+测试
  90. function AutoCalibTest(void)
  91.         if (Calib402() == 0) then
  92.                 print("")
  93.                 AutoTestRC202()
  94.         end
  95. end

  96. --读模拟量输出
  97. function ReadAllChan(n)
  98.         local err, y1,y2,y3,y4,y5,y6,y7
  99.         local str

  100.         err,y1,y2,y3,y4,y5,y6,y7 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F,7)

  101.         if (err == 0) then
  102.                 str = string.format("%d %f, %f, %f, %f, %f, %f, %f", n, y1,y2,y3,y4,y5,y6,y7) print(str)
  103.         else
  104.                 str = string.format("错误代码 = %d", err) print(str)
  105.         end
  106. end

  107. --读NTC温度
  108. function ReadTemp(void)
  109.         local err, y1
  110.         local str

  111.         err, y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + 12,1)
  112.         if (err == 0) then
  113.                 str = string.format("温度 = %f ℃", y1) print(str)
  114.         else
  115.                 str = string.format("错误代码 = %d", err) print(str)
  116.         end
  117. end

  118. --给CH1输入电压
  119. function SetCh1VoltMV(volt)
  120.         local err, y1
  121.         local str

  122.         --切换继电器,通道1电压
  123.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,1,0,0,0)

  124.         --设置DAC电压 - 校准点1
  125.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, volt)
  126.         if (err == 0) then
  127.                 str = string.format("CH1 电压 = %d mV", volt) print(str)
  128.         else
  129.                 str = string.format("错误代码 = %d", err) print(str)
  130.         end
  131. end

  132. --给CH2输入电压
  133. function SetCh2VoltMV(volt)
  134.         local err, y1
  135.         local str

  136.         --切换继电器,通道2电压
  137.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,1,0,0)

  138.         --设置DAC电压 - 校准点1
  139.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, volt)
  140.         if (err == 0) then
  141.                 str = string.format("CH2 电压 = %d mV", volt) print(str)
  142.         else
  143.                 str = string.format("错误代码 = %d", err) print(str)
  144.         end
  145. end

  146. --给CH1输入电流
  147. function SetCh1CurrMA(curr)
  148.         local err, y1
  149.         local str

  150.         --切换继电器,通道1电压
  151.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,1,0)

  152.         --设置DAC电压 - 校准点1
  153.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, curr * 1000)
  154.         if (err == 0) then
  155.                 str = string.format("CH1 电流 = %f mA", curr) print(str)
  156.         else
  157.                 str = string.format("错误代码 = %d", err) print(str)
  158.         end
  159. end

  160. --给CH2输入电流
  161. function SetCh2CurrMA(curr)
  162.         local err, y1
  163.         local str

  164.         --切换继电器,通道1电压
  165.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,0,1)

  166.         --设置DAC电压 - 校准点1
  167.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, curr * 1000)
  168.         if (err == 0) then
  169.                 str = string.format("CH2 电流 = %f mA", curr) print(str)
  170.         else
  171.                 str = string.format("错误代码 = %d", err) print(str)
  172.         end
  173. end

  174. --配置通道参数为电流模式
  175. function ConfigChanRange(_rg)
  176.         local err, y1
  177.         local str

  178.         --通道1
  179.         err = modbus_write_u16(COMx,TimeOut,Addr485,REG03_CF01_EN + CF01_SIGN_TYPE, _rg)
  180.         if (err > 0) then goto quit end

  181.         --通道2
  182.         err = err + modbus_write_u16(COMx,TimeOut,Addr485,REG03_CF01_EN + CF01_SIGN_TYPE + 0x20, _rg)
  183.         if (err > 0) then goto quit end

  184. ::quit::
  185.         if (err == 0) then
  186.                 if (_rg == 0) then
  187.                         str = string.format("配置2个通道为0-20mA成功") print(str)
  188.                 else
  189.                         str = string.format("配置2个通道为0-10V成功") print(str)
  190.                 end
  191.         else
  192.                 str = string.format("错误代码 = %d", err) print(str)
  193.         end
  194. end

  195. --检查温度范围, 返回1表示OK
  196. function Check18B20(temp1, temp2)
  197.         local diff

  198.         if (temp1 < 5 or temp2 < 5 or temp1 > 40  or temp2 > 40) then
  199.                 return 0
  200.         end

  201.         if (temp1 > temp2) then
  202.                 diff = temp1 - temp2
  203.         else
  204.                 diff = temp2 - temp1
  205.         end

  206.         if (diff > 2) then
  207.                 return 0
  208.         else
  209.                 return 1
  210.         end
  211. end

  212. --自动测试
  213. function AutoTestRC202(void)
  214.         local err,y1,y2,y3,y4
  215.         local str
  216.         local time1,time2
  217.         local Model
  218.         local RegAddr

  219.         print("-------开始测试------------------------------------")
  220.         time1 = get_runtime()

  221.         --读硬件型号和版本
  222.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  223.         if (err > 0) then goto quit end
  224.         str = string.format("型号 = %04X 固件版本 = V%X.%02X", y1, y2 >> 8, y2 & 0xFF) print(str)

  225.         Model = y1

  226.         if (Model == RC202_NORMAL) then
  227.                 str = string.format("已识别机型: RC602")  print(str)
  228.         else
  229.                 if (Model == RD202_20MA) then
  230.                         str = string.format("已识别机型: RD202-20MA")  print(str)
  231.                 else
  232.                         if (Model == RD202_18B20) then
  233.                                 str = string.format("已识别机型: RD202-18B20")  print(str)
  234.                         else
  235.                                 if (Model == RD202_PULSE) then
  236.                                         str = string.format("已识别机型: RD202-PULSE")  print(str)
  237.                                 else
  238.                                         if (Model == 0xC402) then
  239.                                                 str = string.format("已识别机型: RC402")  print(str)
  240.                                         else
  241.                                                 str = string.format("未知机型")  print(str)
  242.                                                 goto quit
  243.                                         end
  244.                                 end
  245.                         end
  246.                 end
  247.         end

  248.         --测试DS18B20功能
  249.         if (Model == RC202_NORMAL or Model == RD202_18B20) then
  250.                 str = string.format("\r\n【1】测试DS18B20功能")  print(str)
  251.                 if (Model == RC202_NORMAL) then
  252.                         RegAddr = REG04_CH01_OUT_F + 8
  253.                 else
  254.                         RegAddr = REG04_CH01_OUT_Fl
  255.                 end
  256.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,RegAddr,2)
  257.                 if (err > 0) then
  258.                         goto quit
  259.                 end

  260.                 if (Check18B20(y1,y2) == 1) then
  261.                         str = string.format(" %0.1f℃, %0.1f℃  -- OK ", y1, y2)  print(str)
  262.                 else
  263.                         str = string.format(" %0.1f℃, %0.1f℃  -- Err", y1, y2)  print(str)
  264.                         err = 9
  265.                         goto quit
  266.                 end
  267.         end

  268.         --测试脉冲功能
  269.         if (Model == RC202_NORMAL or Model == RD202_PULSE) then
  270.                 str = string.format("\r\n【2】测试脉冲功能")  print(str)
  271.                 if (Model == RC202_NORMAL) then
  272.                         RegAddr = REG04_CH01_OUT_F + 4
  273.                 else
  274.                         RegAddr = REG04_CH01_OUT_F
  275.                 end
  276.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,RegAddr,2)
  277.                 if (err > 0) then
  278.                         goto quit
  279.                 end

  280.                 if (y1 > 90 and y2 > 90 and y1 < 110 and y2 < 110 ) then
  281.                         str = string.format(" %0.2fHz, %0.2fHz  -- OK ", y1, y2)  print(str)
  282.                 else
  283.                         str = string.format(" %0.2fHz, %0.2fHz   -- Err", y1, y2)  print(str)
  284.                         err = 9
  285.                         goto quit
  286.                 end
  287.         end

  288.         --测试模拟量检测功能
  289.         if (Model == RC202_NORMAL or Model == RD202_20MA or Model == 0xC402) then
  290.                 str = string.format("\r\n【4】测试模拟量功能")  print(str)

  291.                 ConfigChanRange(1)        --切换到电压档位

  292.                 --设置DAC电压
  293.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, 5000)
  294.                 if (err > 0) then goto quit end
  295.                 --切换继电器
  296.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 1, 0,0,0)
  297.                 if (err > 0) then goto quit end
  298.                 delayms(1000)
  299.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F, 1)
  300.                 if (err > 0) then goto quit end
  301.                 if (math.abs(y1 - 5.0) < 0.02) then
  302.                         str = string.format(" CH1 5.000V, %0.3fV  -- OK ", y1)   print(str)
  303.                 else
  304.                         str = string.format(" CH1 5.000V, %0.3fV  -- Err ", y1)  print(str)
  305.                         err = 9
  306.                         goto quit
  307.                 end

  308.                 --设置DAC电压
  309.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, 6000)
  310.                 if (err > 0) then goto quit end
  311.                 --切换继电器
  312.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 1,0,0)
  313.                 if (err > 0) then goto quit end
  314.                 delayms(1000)
  315.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F + 2, 1)
  316.                 if (err > 0) then goto quit end
  317.                 if (math.abs(y1 - 6.0) < 0.02) then
  318.                         str = string.format(" CH2 6.000V, %0.3fV  -- OK ", y1)   print(str)
  319.                 else
  320.                         str = string.format(" CH2 6.000V, %0.3fV  -- Err ", y1)  print(str)
  321.                         err = 9
  322.                         goto quit
  323.                 end

  324.                 print("")
  325.                 ConfigChanRange(0) --切换到电流档位

  326.                 --设置DAC电流
  327.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, 12000)
  328.                 if (err > 0) then goto quit end
  329.                 --切换继电器
  330.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0,1,0)
  331.                 if (err > 0) then goto quit end
  332.                 delayms(1000)
  333.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F, 1)
  334.                 if (err > 0) then goto quit end
  335.                 if (math.abs(y1 - 12.0) < 0.02) then
  336.                         str = string.format(" CH1 12.000mA, %0.3fmA  -- OK ", y1)   print(str)
  337.                 else
  338.                         str = string.format(" CH1 12.000mA, %0.3fmA  -- Err ", y1)  print(str)
  339.                         err = 9
  340.                         goto quit
  341.                 end

  342.                 --设置DAC电流
  343.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, 10000)
  344.                 if (err > 0) then goto quit end
  345.                 --切换继电器
  346.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0,0,1)
  347.                 if (err > 0) then goto quit end
  348.                 delayms(1000)
  349.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F + 2, 1)
  350.                 if (err > 0) then goto quit end
  351.                 if (math.abs(y1 - 10.0) < 0.02) then
  352.                         str = string.format(" CH2 10.000mA, %0.3fmA  -- OK ", y1)   print(str)
  353.                 else
  354.                         str = string.format(" CH2 10.000mA, %0.3fmA  -- Err ", y1)  print(str)
  355.                         err = 9
  356.                         goto quit
  357.                 end
  358.         end

  359.         --测试继电器功能
  360.         if (Model == RC202_NORMAL or Model == RD202_PULSE) then
  361.                 str = string.format("\r\n【3】测试继电器功能")  print(str)

  362.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,0)
  363.                 if (err > 0) then goto quit end
  364.                 delayms(100)
  365.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  366.                 if (y1 == 0 and y2 == 0) then
  367.                         str = string.format(" y1 = 0(%d), y2 = 0(%d)  -- Ok ", y1, y2)  print(str)
  368.                 else
  369.                         str = string.format(" y1 = 0(%d), y2 = 0(%d)  -- Err ", y1, y2)  print(str)
  370.                         err = 9
  371.                         goto quit
  372.                 end

  373.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,1,0)
  374.                 if (err > 0) then goto quit end
  375.                 delayms(100)
  376.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  377.                 if (y1 == 1 and y2 == 0) then
  378.                         str = string.format(" y1 = 1(%d), y2 = 0(%d)  -- Ok ", y1, y2)  print(str)
  379.                 else
  380.                         str = string.format(" y1 = 1(%d), y2 = 0(%d)  -- Err ", y1, y2)  print(str)
  381.                         err = 9
  382.                         goto quit
  383.                 end

  384.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,1)
  385.                 if (err > 0) then goto quit end
  386.                 delayms(100)
  387.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  388.                 if (y1 == 0 and y2 == 1) then
  389.                         str = string.format(" y1 = 0(%d), y2 = 1(%d)  -- Ok ", y1, y2)  print(str)
  390.                 else
  391.                         str = string.format(" y1 = 0(%d), y2 = 1(%d)  -- Err ", y1, y2)  print(str)
  392.                         err = 9
  393.                         goto quit
  394.                 end

  395.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,0)
  396.                 if (err > 0) then goto quit end
  397.         end

  398. ::quit::
  399.         if (err == 0) then
  400.                 PrintOk()
  401.                 time2 = get_runtime()
  402.                 time1 = (time2 - time1) / 1000
  403.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)
  404.         else
  405.                 if (err == 6) then
  406.                         print("RS485通信错误")
  407.                 else
  408.                         str = string.format("错误代码 = %d", err)
  409.                         print(str)
  410.                 end
  411.                 PrintError()
  412.         end
  413. end

  414. function AutoTestRC608(void)
  415.         local err,y1,y2,y3,y4
  416.         local str
  417.         local time1,time2
  418.         local Model
  419.         local SoftVer
  420.         local RFHard
  421.         local RFSoft
  422.         local ModelStr = "xxxxx"
  423.         local RegAddr
  424.         local ch_num

  425.         print("\r\n-------开始测试---------")
  426.         time1 = get_runtime()

  427.         uart_clear_rx(COMx)

  428.         err =  modbus_write_u16(COMx, 1000, 1, 0x1007, 1)

  429.         --读硬件型号和版本
  430.         err,Model,SoftVer = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  431.         if (err > 0) then goto quit end

  432.         uart_clear_rx(COMx)
  433.         err, RFHard, RFSoft = modbus_read_u16(COMx,TimeOut,Addr485,0x9009,2)
  434.         if (err > 0) then goto quit end

  435.         if (Model == 0xC602) then
  436.                 ModelStr = "RC602"
  437.                 ch_num = 2
  438.         else
  439.                 if (Model == 0xC604) then
  440.                         ModelStr = "RC604"
  441.                         ch_num = 4
  442.                 else
  443.                         if (Model == 0xC608) then
  444.                                 ModelStr = "RC608"
  445.                                 ch_num = 8
  446.                         else
  447.                                 if (Model == 0xC612) then
  448.                                         ModelStr = "RC612"
  449.                                         ch_num = 12
  450.                                 else
  451.                                         if (Model == 0xC616) then
  452.                                                 ModelStr = "RC616"
  453.                                                 ch_num = 16
  454.                                         else
  455.                                                 if (Model == 0xC632) then
  456.                                                         ModelStr = "RC632"
  457.                                                         ch_num = 32
  458.                                                 else
  459.                                                         if (Model == 0xC601) then
  460.                                                                 ModelStr = "RC601"
  461.                                                                 ch_num = 1
  462.                                                         else
  463.                                                                 ch_num = -1
  464.                                                         end
  465.                                                 end
  466.                                         end
  467.                                 end
  468.                         end
  469.                 end
  470.         end

  471.         if (RFHard == 0) then ModelStr = ModelStr.."-XXX" end
  472.         if (RFHard == 1) then ModelStr = ModelStr.."-485" end
  473.         if (RFHard == 2) then ModelStr = ModelStr.."-232" end
  474.         if (RFHard == 0x30) then ModelStr = ModelStr.."-2K" end
  475.         if (RFHard == 0x31) then ModelStr = ModelStr.."-8K" end

  476.         if (RFHard == 0x32) then
  477.                 if ((RFSoft & 0xFF) == 0x14) then
  478.                         ModelStr = ModelStr.."-3K"
  479.                 else
  480.                         if ((RFSoft & 0xFF) == 0x1E) then
  481.                                 ModelStr = ModelStr.."-7K"
  482.                         else
  483.                                 ModelStr = ModelStr.."-xx"
  484.                         end
  485.                 end
  486.         end

  487.         if (RFHard == 0x82) then ModelStr = ModelStr.."-WiFi" end
  488.         if (RFHard == 0x83) then ModelStr = ModelStr.."-NBIoT" end

  489.         str = string.format("型号: %s  V%X.%02X", ModelStr, SoftVer >> 8, SoftVer & 0xFF) print(str)

  490.         if (ch_num > 0) then
  491.                 TestRC608(ch_num)
  492.         else

  493.         end

  494.         if (RFHard == 0x30 or RFHard == 0x32) then
  495.                 delayms(500)
  496.                 Test433M()
  497.         end

  498. ::quit::
  499.         if (err == 0) then
  500.                 time2 = get_runtime()
  501.                 time1 = (time2 - time1) / 1000
  502.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)
  503.         else
  504.                 if (err == 6) then
  505.                         print("RS485通信错误")
  506.                 end
  507.                 PrintError()
  508.         end
  509. end

  510. --自动识别型号
  511. function AutoDetect(void)
  512.         local err,y1
  513.         local i

  514.         err = 0
  515.         err = err + modbus_write_u16(COMx, 1000, Addr485, 0x9100, 4)
  516.         if (err > 0) then goto quit end
  517.         delayms(100)

  518.         for i=1,50,1 do
  519.                 err,y1 = modbus_read_u16(COMx,1000, Addr485,0x9100, 1)
  520.                 if (err == 0) then
  521.                         if (y1 == 0) then
  522.                                 break
  523.                         end
  524.                 end

  525.                 delayms(100)
  526.         end

  527. ::quit::
  528.         if (err > 0) then
  529.                 print("-------识别失败----------")
  530.                 beep(5,5,3)
  531.         else
  532.                 print("-------识别OK----------")
  533.                 AutoTestRC608()
  534.         end
  535. end

  536. --自动测试RC601 RC602 604 608 612 616 632
  537. function TestRC608(ch_num)
  538.         local err,y1,y2,y3,y4,y5,y6,y7,y8
  539.         local str
  540.         local time1,time2
  541.         local Model
  542.         local RegAddr
  543.         local S = {0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,   0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
  544.         local Y = {0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,   0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
  545.         local i
  546.         local terr = 0
  547.         local strerr = ""

  548.         time1 = get_runtime()

  549.         uart_clear_rx(COMx)
  550.         err = modbus_write_do(COMx,TimeOut,Addr485,1, 0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,   0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
  551.         if (err > 0) then goto quit end
  552.         delayms(60)
  553.         for i = 0, ch_num - 1, 1 do
  554.                 RegAddr = 1 + i

  555.                 uart_clear_rx(COMx)
  556.                 err, y1 = modbus_read_di(COMx,TimeOut,RC604Addr, RegAddr, 1)
  557.                 if (err > 0) then goto quit end

  558.                 uart_clear_rx(COMx)
  559.                 err = modbus_write_do(COMx,TimeOut,Addr485,RegAddr, 1)
  560.                 if (err > 0) then goto quit end
  561.                 delayms(60)
  562.                 uart_clear_rx(COMx)
  563.                 err, y2 = modbus_read_di(COMx,TimeOut,RC604Addr, RegAddr, 1)
  564.                 if (err > 0) then goto quit end

  565.                 if (y1 == 0 and y2 == 1) then
  566.                         --str = string.format(" Y%d  -- Ok ", i + 1)  print(str)
  567.                 else
  568.                         --str = string.format(" Y%d  -- Err %d,%d", i + 1, y1, y2)  print(str)
  569.                         err = 9
  570.                         terr = terr + 1
  571.                         strerr = strerr..string.format("Y%d ", i + 1)
  572.                 end
  573.         end

  574.         print("")
  575.         uart_clear_rx(COMx)
  576.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,   0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0)
  577.         if (err > 0) then goto quit end
  578.         delayms(60)
  579.         for i = 0, ch_num - 1, 1 do
  580.                 RegAddr = 1 + i
  581.                 uart_clear_rx(COMx)
  582.                 err, y1 = modbus_read_di(COMx,TimeOut,Addr485, RegAddr, 1)
  583.                 if (err > 0) then goto quit end

  584.                 uart_clear_rx(COMx)
  585.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,RegAddr, 1)
  586.                 if (err > 0) then goto quit end
  587.                 delayms(60)
  588.                 uart_clear_rx(COMx)
  589.                 err, y2 = modbus_read_di(COMx,TimeOut,Addr485, RegAddr, 1)
  590.                 if (err > 0) then goto quit end

  591.                 if (y1 == 0 and y2 == 1) then
  592.                         --str = string.format(" X%d  -- Ok ", i + 1)  print(str)
  593.                 else
  594.                         --str = string.format(" X%d  -- Err %d,%d", i + 1, y1, y2)  print(str)
  595.                         err = 9
  596.                         terr = terr + 1
  597.                         strerr = strerr..string.format("X%d ", i + 1)
  598.                 end
  599.         end

  600. ::quit::
  601.         if (err == 0 and terr == 0) then
  602.                 print("-------IO测试OK----------")
  603.                 beep()
  604.         else
  605.                 if (err == 6) then
  606.                         print("RS485通信错误")
  607.                 else
  608.                         if (terr > 0) then
  609.                                 str = "错误:"..strerr        print(str)
  610.                         else
  611.                                 str = string.format(" 错误代码 = %d", terr)        print(str)
  612.                         end
  613.                 end

  614.                 print("-------IO测试失败----------")
  615.                 beep(5,5,3)
  616.         end
  617. end

  618. --检查433M射频功能
  619. function Test433M(void)
  620.         local err,y1,y2,y3,y4
  621.         local str
  622.         local COM_TTL = 7
  623.         local rx_len = 0
  624.         local rx_str = ""

  625.         err = 0
  626.         err = err + modbus_write_u16(COMx, 1000, 1, 0x1007, 1)

  627.         gpio_cfg(0, 5)        -- 配置D0为UART功能
  628.         gpio_cfg(1, 5)        -- 配置D1为UART功能
  629.         uart_cfg(COM_TTL, 9600, 0, 8, 1)

  630.         --D2 D3 = M0 M1 = 1 进入指令模式
  631.         gpio_cfg(2,1)
  632.         gpio_cfg(3,1)
  633.         gpio_write(2,1)
  634.         gpio_write(3,1)

  635.         delayms(20)

  636.         uart_clear_rx(COM_TTL)

  637.         --0001 1111    0000 0000
  638.         uart_send(COM_TTL, "\xC2\xFF\xFF\x1F\x17\x00")
  639.         rx_len, rx_str = uart_recive(COM_TTL, 6, 100)
  640.         --print_hex(rx_len, rx_str)

  641.         delayms(30)

  642.         --M0 M1 = 0 进入工作状态
  643.         gpio_write(2,0)
  644.         gpio_write(3,0)
  645.         delayms(20)

  646.         err = err + modbus_write_do(COM_TTL,1000, 1, 1, 1)
  647.         delayms(150)
  648.         err = err + modbus_write_do(COM_TTL,1000, 1, 1, 0)

  649.         err = err + modbus_write_u16(COMx, 1000, 1, 0x1007, 3)

  650.         if (err > 0) then
  651.                 print("-------433M测试失败----------")
  652.                 beep(5,5,3)
  653.         else
  654.                 print("-------433M测试OK----------")
  655.                 beep()
  656.         end
  657. end

  658. ------------------------------------------------------

  659. --检查一个值是否在公差范围 1表示err 0表示ok
  660. function check_err(data, mid, diff)
  661.         local re
  662.         local dd

  663.         if (mid < 0) then
  664.                 dd = -mid * diff
  665.         else
  666.                 dd = mid * diff
  667.         end

  668.         if ((data >= mid - dd) and  (data <= mid + dd)) then
  669.                 re = 0
  670.         else
  671.                 re = 1
  672.         end
  673.         return re
  674. end

  675. --校准  返回0表示0K, 1表示错误
  676. function Calib402(void)
  677.         local Model
  678.         local err,y1,y2,y3,y4
  679.         local x1,x2,K,B
  680.         local str
  681.         local time1,time2
  682.         local RegAddr
  683.         local adc1
  684.         local adc2
  685.         local Temp
  686.         local i
  687.         local VoltAdc1 = 1202
  688.         local VoltAdc2 = 2860
  689.         local CurrAdc1 = 615
  690.         local CurrAdc2 = 2923
  691.         local DIFF = 0.05

  692.         print("-------开始校准------------------------------------")
  693.         time1 = get_runtime()

  694.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,RC604Addr,0x9000,2)
  695.         if (err > 0) then
  696.                 str = string.format("未找到工装RC604") print(str)
  697.                 goto quit
  698.         end

  699.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,RC302Addr,0x9000,2)
  700.         if (err > 0) then
  701.                 str = string.format("未找到工装RC302") print(str)
  702.                 goto quit
  703.         end

  704.         --初始化基本参数和模拟通道配置参数
  705.         err = modbus_write_u16(COMx,2000,Addr485,0x9100,0x5A50)
  706.         if (err > 0) then
  707.                 str = string.format("初始化基本参数和模拟通道配置参数失败") print(str)
  708.                 goto quit
  709.         else
  710.                 str = string.format("初始化基本参数和模拟通道配置参数 ok") print(str)
  711.         end

  712.         --初始化模拟量校准参数
  713.         err = modbus_write_u16(COMx,3000,Addr485,0x9100,0x5AA0)
  714.         if (err > 0) then
  715.                 str = string.format("初始化模拟量校准参数失败") print(str)
  716.                 goto quit
  717.         else
  718.                 str = string.format("初始化模拟量校准参数 ok") print(str)
  719.         end
  720.         print("")

  721.         --读硬件型号和版本
  722.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  723.         if (err > 0) then goto quit end
  724.         str = string.format("型号 = %04X 固件版本 = V%X.%02X", y1, y2 >> 8, y2 & 0xFF) print(str)

  725.         Model = y1

  726.         if (Model == RC202_NORMAL) then
  727.                 str = string.format("已识别机型: RC602")  print(str)
  728.         else
  729.                 if (Model == RD202_20MA) then
  730.                         str = string.format("已识别机型: RD202-20MA")  print(str)
  731.                 else
  732.                         if (Model == RD202_18B20) then
  733.                                 str = string.format("已识别机型: RD202-18B20")  print(str)
  734.                         else
  735.                                 if (Model == RD202_PULSE) then
  736.                                         str = string.format("已识别机型: RD202-PULSE")  print(str)
  737.                                 else
  738.                                         if (Model == 0xC402) then
  739.                                                 str = string.format("已识别机型: RC402")  print(str)
  740.                                         else
  741.                                                 str = string.format("未知机型")  print(str)
  742.                                                 goto quit
  743.                                         end
  744.                                 end
  745.                         end
  746.                 end
  747.         end

  748.         if (Model ~= RC202_NORMAL and Model ~= RD202_20MA and Model ~= 0xC402) then
  749.                 str = string.format(" 该型号无需模拟量校准")  print(str)
  750.                 goto quit
  751.         end

  752.         err = modbus_write_u16(COMx,TimeOut,Addr485,REG06_CALIB_KEY, 0x55AA)
  753.         if (err > 0) then goto quit end
  754.         --print("校准开关已打开")

  755.         --print("--校准零位...")
  756.                 --切换继电器
  757.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,0,0)
  758.                 if (err > 0) then goto quit end

  759.                 delayms(1000)

  760.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_AVG, 2)
  761.                 if (err > 0) then goto quit end
  762.                 if (check_err(y1, 0.5, 1) == 1) then
  763.                         str = string.format(" CH1 零位ADC = %f --- Err", y1) print(str)
  764.                         err = 9
  765.                         goto quit
  766.                 end
  767.                 if (check_err(y2, 0.5, 1) == 1) then
  768.                         str = string.format(" CH2 零位ADC = %f --- Err", y1) print(str)
  769.                         err = 9
  770.                         goto quit
  771.                 end

  772.                 --写通道1零位ADC,2个量程ADC一样
  773.                 RegAddr =         REG03_CC01_K0 + CC01_ZERO_ADC_0;
  774.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y1)
  775.                 if (err > 0) then goto quit end

  776.                 RegAddr =         REG03_CC01_K0 + CC01_ZERO_ADC_0 + RANGE_REG_STEP;
  777.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y1)
  778.                 if (err > 0) then goto quit end

  779.                 --写通道2零位ADC,2个量程ADC一样
  780.                 RegAddr =         REG03_CC01_K0 + CALIB_REG_STEP + CC01_ZERO_ADC_0;
  781.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y2)
  782.                 if (err > 0) then goto quit end

  783.                 RegAddr =         REG03_CC01_K0 + CALIB_REG_STEP + CC01_ZERO_ADC_0 + RANGE_REG_STEP;
  784.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y2)
  785.                 if (err > 0) then goto quit end

  786.                 str = string.format(" CH1 CH2 零位ADC = %f, %f --OK", y1, y2) print(str)

  787.         --读取NTC温度
  788.         err, Temp = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + 12,1)
  789.         if (err > 0) then goto quit end
  790.         str = string.format(" NTC温度 = %f ℃", Temp) print(str)

  791.         --校准2个通道的电压档位
  792.         for i = 0, 1, 1 do

  793.                 str = string.format("\r\n校准通道%d电压,第1点 %dmV, 第2点 %dmV", i + 1, CALIB_VOTL1, CALIB_VOTL2)
  794.                 print(str)

  795.                 --切换继电器 电压
  796.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 1 - i, i,0,0)
  797.                 if (err > 0) then
  798.                         goto quit
  799.                 end

  800.                 --设置DAC电压 - 校准点1
  801.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, CALIB_VOTL1)
  802.                 if (err > 0) then
  803.                         goto quit
  804.                 end

  805.                 delayms(1000)

  806.                 err,y1 = modbus_read_float(COMx,TimeOut, Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  807.                 if (err > 0) then goto quit end
  808.                 --str = string.format("  RMS_ADC = %f", y1) print(str)

  809.                 --保存第1点adc
  810.                 adc1 = y1
  811.                 if (check_err(adc1, VoltAdc1, DIFF) == 1) then
  812.                         str = string.format(" CH%d电压Adc1 = %f -- Err (ok = %f)", i + 1, y1, VoltAdc1) print(str)
  813.                         err = 9
  814.                         goto quit
  815.                 else
  816.                         str = string.format(" CH%d电压Adc1 = %f -- Ok", i + 1, y1) print(str)
  817.                 end

  818.                 --str = string.format("\r\n校准通道%d电压,第2点 %dmV", i + 1, CALIB_VOTL2) print(str)
  819.                 --设置DAC电压 - 校准点2
  820.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, CALIB_VOTL2)
  821.                 if (err > 0) then
  822.                         goto quit
  823.                 end

  824.                 delayms(1000)

  825.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  826.                 if (err > 0) then goto quit end
  827.                 --str = string.format("  RMS_ADC = %f", y1) print(str)

  828.                 --保存第2点adc
  829.                 adc2 = y1
  830.                 if (check_err(adc2, VoltAdc2, DIFF) == 1) then
  831.                         str = string.format(" CH%d电压Adc2 = %f -- Err (ok = %f)", i + 1, y1, VoltAdc2) print(str)
  832.                         err = 9
  833.                         goto quit
  834.                 else
  835.                         str = string.format(" CH%d电压Adc2 = %f -- Ok", i + 1, y1) print(str)
  836.                 end

  837.                 --计算K,B
  838.                 x1 = adc1
  839.                 y1 = CALIB_VOTL1 / 1000
  840.                 x2 = adc2
  841.                 y2 = CALIB_VOTL2 / 1000

  842.                 K = (y2 - y1) / (x2 - x1);
  843.                 B = (x2 * y1 - x1 * y2)/(x2 - x1);

  844.                 str = string.format(" X1 = %f, X2 = %f, X2 = %f, Y2 = %f",x1,y1,x2,y2) print(str)
  845.                 str = string.format(" K = %f, B = %f", K, B) print(str)

  846.                 RegAddr = REG03_CC01_K0 + i * CALIB_REG_STEP + RANGE_REG_STEP + CC01_K_0
  847.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, K,B,Temp,0,0)
  848.                 if (err > 0) then goto quit end
  849.                 str = string.format(" 通道%d电压档校准参数写入成功", i + 1) print(str)
  850.         end

  851.         --校准电流档位
  852.         print("")

  853.         for i = 0, 1, 1 do
  854.                 --校准通道1电流
  855.                 str = string.format("\r\n校准通道%d电流,第1点 %fmA  第2点 %fmA", i + 1, CALIB_CURR1 / 1000, CALIB_CURR2 / 1000)
  856.                 print(str)

  857.                 --切换继电器 电压
  858.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0, 1 - i, i)
  859.                 if (err > 0) then
  860.                         goto quit
  861.                 end

  862.                 --设置DAC电压 - 校准点1
  863.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, CALIB_CURR1)
  864.                 if (err > 0) then
  865.                         goto quit
  866.                 end

  867.                 delayms(1000)

  868.                 err,y1 = modbus_read_float(COMx,TimeOut, Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  869.                 if (err > 0) then goto quit end
  870.                 --str = string.format("  RMS_ADC = %f", y1) print(str)

  871.                 --保存第1点adc
  872.                 adc1 = y1
  873.                 if (check_err(adc1, CurrAdc1, DIFF) == 1) then
  874.                         str = string.format("  CH%d电流Adc1 = %f -- Err (ok = %f)", i + 1, y1, CurrAdc1) print(str)
  875.                         err = 9
  876.                         goto quit
  877.                 else
  878.                         str = string.format("  CH%d电流Adc1 = %f -- Ok", i + 1, y1) print(str)
  879.                 end

  880.                 --str = string.format("\r\n校准通道%d电流,第1点 %duA", i + 1, CALIB_CURR2)        print(str)
  881.                 --设置DAC电压 - 校准点2
  882.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, CALIB_CURR2)
  883.                 if (err > 0) then
  884.                         goto quit
  885.                 end

  886.                 delayms(1000)

  887.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  888.                 if (err > 0) then goto quit end
  889.                 --str = string.format("  RMS_ADC = %f", y1) print(str)

  890.                 --保存第2点adc
  891.                 adc2 = y1
  892.                 if (check_err(adc2, CurrAdc2, DIFF) == 1) then
  893.                         str = string.format("  CH%d电流Adc2 = %f -- Err (ok = %f)", i + 1, y1, CurrAdc2) print(str)
  894.                         err = 9
  895.                         goto quit
  896.                 else
  897.                         str = string.format("  CH%d电流Adc2 = %f -- Ok", i + 1, y1) print(str)
  898.                 end

  899.                 --计算K,B
  900.                 x1 = adc1
  901.                 y1 = CALIB_CURR1 / 1000
  902.                 x2 = adc2
  903.                 y2 = CALIB_CURR2 / 1000

  904.                 K = (y2 - y1) / (x2 - x1);
  905.                 B = (x2 * y1 - x1 * y2)/(x2 - x1);

  906.                 str = string.format(" X1 = %f, X2 = %f, X2 = %f, Y2 = %f",x1,y1,x2,y2) print(str)
  907.                 str = string.format(" K = %f, B = %f", K, B) print(str)

  908.                 RegAddr = REG03_CC01_K0 + i * CALIB_REG_STEP + 0 * RANGE_REG_STEP + CC01_K_0
  909.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, K,B,Temp,0,0)
  910.                 if (err > 0) then goto quit end
  911.                 str = string.format("--通道%d电流档校准参数写入成功", i + 1) print(str)
  912.         end

  913. ::quit::
  914.         if (err == 0) then
  915.                 print("-------校准成功------------------------------------")
  916.                 time2 = get_runtime()
  917.                 time1 = (time2 - time1) / 1000
  918.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)
  919.                 return 0
  920.         else
  921.                 if (err == 6) then
  922.                         print("RS485通信错误")
  923.                 else
  924.                         str = string.format("错误代码 = %d", err)
  925.                         print(str)
  926.                 end
  927.                 PrintError()
  928.                 return 1
  929.         end
  930. end
复制代码


回复

使用道具 举报

6

主题

130

回帖

148

积分

初级会员

积分
148
发表于 2021-10-27 11:52:12 | 显示全部楼层
eric2013 发表于 2019-10-26 10:57
安装个LUA5.3,共计407个API,查阅更加方便些:

这是啥软件
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2021-10-27 12:09:02 | 显示全部楼层

分享一个超棒的编程手册管理软件Zeal,已支持194种编程文档,查阅语法问题极方便
http://www.armbbs.cn/forum.php?m ... 1233&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-12-16 15:56:21 | 显示全部楼层
eric2013 发表于 2021-9-14 08:19
自己搞,简单玩一些特定功能是可以的,稍复杂点的就不行了,需要做编程语言解析,难点就在这个地方。

...

请问大佬,这么大的文件,是全部加载到buff里面使用lua一次性运行吗?还是可以分段运行?或者是通过哪种方式运行?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2021-12-16 16:14:55 | 显示全部楼层
重庆破锅 发表于 2021-12-16 15:56
请问大佬,这么大的文件,是全部加载到buff里面使用lua一次性运行吗?还是可以分段运行?或者是通过哪种 ...

整体刷的,给LUA开了200多KB的RAM空间。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2022-5-12 22:46:00 | 显示全部楼层
eric2013 发表于 2021-12-16 16:14
整体刷的,给LUA开了200多KB的RAM空间。

如果有SD卡,做个文件系统,加个wifi模块,从云端下载各种lua报错到sd卡中,那这样,岂不是超级灵活(前提是我们的MCU把各种c function做好提供给lua调用)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2022-5-13 11:33:48 | 显示全部楼层
blizzard 发表于 2022-5-12 22:46
如果有SD卡,做个文件系统,加个wifi模块,从云端下载各种lua报错到sd卡中,那这样,岂不是超级灵活(前 ...

是的,我们的外网脱机烧录就是这样的。
回复

使用道具 举报

6

主题

32

回帖

50

积分

初级会员

积分
50
发表于 2022-7-4 11:58:00 | 显示全部楼层
这技术好牛啊
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-7-21 19:01:40 | 显示全部楼层
请问外部的lua文件是如何传到MCU, 还有MCU是如何读取lua脚本并且执行每一个语句的,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2022-7-22 01:17:38 | 显示全部楼层
Dellg7 发表于 2022-7-21 19:01
请问外部的lua文件是如何传到MCU, 还有MCU是如何读取lua脚本并且执行每一个语句的,谢谢

USB,以太网或者WiFi方式传输给MCU。

APP里面有lua的解析处理,移植了lua库。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 19:11 , Processed in 0.397645 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表