硬汉嵌入式论坛

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

[脱机烧录] H7-TOOL应用实战之出厂批量测试我们的10几款IO控制器和脱机烧录一条龙

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-4-13 07:58:54 | 显示全部楼层 |阅读模式
近期分享些H7-TOOL在我们自己的产品中的应用实战。


大大方便了我们工作人员的设备测试和烧录工作。


1、IO控制器就是这个产品:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=20964

2.png
1.png

2、通过H7-TOOL可以实现我们10几款IO控制器的混合烧录,操作简单,插入后自动烧录,之前的视频展示:
https://v.qq.com/x/page/o0932ppnuwx.html

3、出厂测试LUA脚本,直接使用H7-TOOL上位机加载到H7-TOOL即可使用,随时可以更新。也可以脱机存到eMMC里面随时使用。

无线IO模块TOOL版.lua (31.8 KB, 下载次数: 7)

  1. --F01=测试RC602-632,AutoTestRC608(8)
  2. --F02=测试无线,Test433M()
  3. --F03=RC402 202校准+检测, AutoCalibTest()
  4. --F04=RC402 202校准模拟量,Calib402()
  5. --F05=RC402 202自动检测,AutoTestRC202()
  6. --F06=RC402 202配置为0-20mA,ConfigChanRange(0)
  7. --F07=RC402 202配置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. --F13=测试0-10V线性度,TestChVolt(1)
  15. --F14=测试0-20mA线性度,TestChCurr(1)



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

  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. --失败
  81. function PrintError(void)
  82.         print("-------测试失败----------")
  83.         beep(5,5,3)
  84. end

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

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

  97. --读模拟量输出
  98. function ReadAllChan(n)
  99.         local err, y1,y2,y3,y4,y5,y6,y7
  100.         local str
  101.         
  102.         err,y1,y2,y3,y4,y5,y6,y7 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F,7)        
  103.         
  104.         if (err == 0) then        
  105.                 str = string.format("%d %f, %f, %f, %f, %f, %f, %f", n, y1,y2,y3,y4,y5,y6,y7) print(str)
  106.         else
  107.                 str = string.format("错误代码 = %d", err) print(str)
  108.         end
  109. end

  110. --读NTC温度
  111. function ReadTemp(void)
  112.         local err, y1
  113.         local str
  114.         
  115.         err, y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + 12,1)
  116.         if (err == 0) then        
  117.                 str = string.format("温度 = %f ℃", y1) print(str)
  118.         else
  119.                 str = string.format("错误代码 = %d", err) print(str)
  120.         end
  121. end

  122. --给CH1输入电压
  123. function SetCh1VoltMV(volt)
  124.         local err, y1
  125.         local str
  126.         
  127.         --切换继电器,通道1电压
  128.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,1,0,0,0)

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

  137. --给CH2输入电压
  138. function SetCh2VoltMV(volt)
  139.         local err, y1
  140.         local str
  141.         
  142.         --切换继电器,通道2电压
  143.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,1,0,0)

  144.         --设置DAC电压 - 校准点1
  145.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, volt)
  146.         if (err == 0) then        
  147.                 str = string.format("CH2 电压 = %d mV", volt) print(str)
  148.         else
  149.                 str = string.format("错误代码 = %d", err) print(str)
  150.         end        
  151. end

  152. --给CH1输入电流
  153. function SetCh1CurrMA(curr)
  154.         local err, y1
  155.         local str
  156.         
  157.         --切换继电器,通道1电压
  158.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,1,0)

  159.         --设置DAC电压 - 校准点1
  160.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, curr * 1000)
  161.         if (err == 0) then        
  162.                 str = string.format("CH1 电流 = %f mA", curr) print(str)
  163.         else
  164.                 str = string.format("错误代码 = %d", err) print(str)
  165.         end               
  166. end

  167. --给CH2输入电流
  168. function SetCh2CurrMA(curr)
  169.         local err, y1
  170.         local str
  171.         
  172.         --切换继电器,通道1电压
  173.         err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,0,1)

  174.         --设置DAC电压 - 校准点1
  175.         err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, curr * 1000)
  176.         if (err == 0) then        
  177.                 str = string.format("CH2 电流 = %f mA", curr) print(str)
  178.         else
  179.                 str = string.format("错误代码 = %d", err) print(str)
  180.         end               
  181. end

  182. --配置通道参数为电流模式
  183. function ConfigChanRange(_rg)
  184.         local err, y1
  185.         local str
  186.         
  187.         --通道1        
  188.         err = modbus_write_u16(COMx,TimeOut,Addr485,REG03_CF01_EN + CF01_SIGN_TYPE, _rg)
  189.         if (err > 0) then goto quit end

  190.         --通道2
  191.         err = err + modbus_write_u16(COMx,TimeOut,Addr485,REG03_CF01_EN + CF01_SIGN_TYPE + 0x20, _rg)
  192.         if (err > 0) then goto quit end        
  193.         
  194. ::quit::
  195.         if (err == 0) then        
  196.                 if (_rg == 0) then
  197.                         str = string.format("配置2个通道为0-20mA成功") print(str)
  198.                 else
  199.                         str = string.format("配置2个通道为0-10V成功") print(str)
  200.                 end
  201.         else
  202.                 str = string.format("错误代码 = %d", err) print(str)
  203.         end               
  204. end

  205. --测试电压线性度,CH=1 CH=2
  206. function TestChVolt(ch)
  207.         local err, y1
  208.         local str
  209.         local volt
  210.         local i
  211.         local diff
  212.         
  213.         str = string.format("--逐点测试CH%d电压线性度", ch) print(str)
  214.         
  215.         --切换继电器,通道2电压
  216.         if (ch == 1) then
  217.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,1,0,0,0)               
  218.         else
  219.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,1,0,0)
  220.         end
  221.         if (err == 0) then        
  222.                
  223.         else
  224.                 str = string.format("错误代码 = %d", err) print(str)
  225.         end               
  226.         
  227.         volt = 0
  228.         for i = 0, 100, 1 do
  229.                 --设置DAC电压 - 校准点1
  230.                 err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, volt)
  231.                 if (err == 0) then        
  232.                         
  233.                 else
  234.                         str = string.format("错误代码 = %d", err) print(str)
  235.                         break
  236.                 end        
  237.                
  238.                 delayms(1000)

  239.                 err, y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + (ch - 1) * 2,1)
  240.                 if (err == 0) then        
  241.                         y1 = y1 * 1000
  242.                         if (volt == 0) then
  243.                                 diff = 0
  244.                         else
  245.                                 diff = 100 * (y1 - volt)  / 10000
  246.                         end
  247.                         str = string.format("dac = %5.3fmV adc = %5.3fmV 误差 %f%%", volt, y1, diff) print(str)
  248.                 else
  249.                         str = string.format("错误代码 = %d", err) print(str)
  250.                         break
  251.                 end
  252.                
  253.                 if (volt < 100) then volt = volt + 10
  254.                 else
  255.                         if (volt < 5000) then volt = volt + 100
  256.                         else
  257.                                 volt = volt + 1000
  258.                         end
  259.                 end
  260.                
  261.                 if (volt > 11000) then
  262.                         break
  263.                 end
  264.         end
  265. end

  266. --测试电流线性度,CH=1 CH=2
  267. function TestChCurr(ch)
  268.         local err, y1
  269.         local str
  270.         local curr
  271.         local i
  272.         local diff
  273.         
  274.         str = string.format("--逐点测试CH%d电流线性度", ch) print(str)
  275.         
  276.         --切换继电器,通道2电压
  277.         if (ch == 1) then
  278.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,1,0)               
  279.         else
  280.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,0,1)
  281.         end
  282.         if (err == 0) then        
  283.                
  284.         else
  285.                 str = string.format("错误代码 = %d", err) print(str)
  286.         end               
  287.         
  288.         curr = 0
  289.         for i = 0, 100, 1 do
  290.                 --设置DAC电流 - 校准点1
  291.                 err = err + modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, curr)
  292.                 if (err == 0) then        
  293.                         
  294.                 else
  295.                         str = string.format("错误代码 = %d", err) print(str)
  296.                         break
  297.                 end        
  298.                
  299.                 delayms(1000)

  300.                 err, y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + (ch - 1) * 2,1)
  301.                 if (err == 0) then        
  302.                         if (curr == 0) then
  303.                                 diff = 0
  304.                         else
  305.                                 diff = 100 * ((y1 * 1000) - curr)  / 20000
  306.                         end
  307.                         str = string.format("dac = %5.3fmA adc = %5.3fmA 误差 %f%%", curr / 1000, y1, diff) print(str)
  308.                 else
  309.                         str = string.format("错误代码 = %d", err) print(str)
  310.                         break
  311.                 end
  312.                
  313.                 if (curr < 100) then curr = curr + 10
  314.                 else
  315.                         if (curr < 5000) then curr = curr + 100
  316.                         else
  317.                                 curr = curr + 1000
  318.                         end
  319.                 end
  320.                
  321.                 if (curr > 21000) then
  322.                         break
  323.                 end
  324.         end
  325. end

  326. --检查温度范围, 返回1表示OK
  327. function Check18B20(temp1, temp2)
  328.         local diff
  329.         
  330.         if (temp1 < 5 or temp2 < 5 or temp1 > 40  or temp2 > 40) then
  331.                 return 0
  332.         end
  333.         
  334.         if (temp1 > temp2) then
  335.                 diff = temp1 - temp2
  336.         else
  337.                 diff = temp2 - temp1
  338.         end
  339.         
  340.         if (diff > 2) then
  341.                 return 0
  342.         else
  343.                 return 1
  344.         end
  345. end
  346.         
  347. --自动测试
  348. function AutoTestRC202(void)
  349.         local err,y1,y2,y3,y4
  350.         local str
  351.         local time1,time2
  352.         local Model
  353.         local RegAddr
  354.         
  355.         print("-------开始测试------------------------------------")
  356.         time1 = get_runtime()
  357.          
  358.         --读硬件型号和版本        
  359.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  360.         if (err > 0) then goto quit end
  361.         str = string.format("型号 = %04X 固件版本 = V%X.%02X", y1, y2 >> 8, y2 & 0xFF) print(str)
  362.         
  363.         Model = y1
  364.         
  365.         if (Model == RC202_NORMAL) then
  366.                 str = string.format("已识别机型: RC602")  print(str)
  367.         else
  368.                 if (Model == RD202_20MA) then
  369.                         str = string.format("已识别机型: RD202-20MA")  print(str)               
  370.                 else
  371.                         if (Model == RD202_18B20) then
  372.                                 str = string.format("已识别机型: RD202-18B20")  print(str)
  373.                         else
  374.                                 if (Model == RD202_PULSE) then
  375.                                         str = string.format("已识别机型: RD202-PULSE")  print(str)
  376.                                 else
  377.                                         if (Model == 0xC402) then
  378.                                                 str = string.format("已识别机型: RC402")  print(str)                                       
  379.                                         else
  380.                                                 str = string.format("未知机型")  print(str)
  381.                                                 goto quit
  382.                                         end
  383.                                 end
  384.                         end
  385.                 end
  386.         end

  387.         --测试DS18B20功能
  388.         if (Model == RC202_NORMAL or Model == RD202_18B20) then
  389.                 str = string.format("\r\n【1】测试DS18B20功能")  print(str)
  390.                 if (Model == RC202_NORMAL) then
  391.                         RegAddr = REG04_CH01_OUT_F + 8
  392.                 else
  393.                         RegAddr = REG04_CH01_OUT_Fl
  394.                 end
  395.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,RegAddr,2)
  396.                 if (err > 0) then
  397.                         goto quit
  398.                 end
  399.                
  400.                 if (Check18B20(y1,y2) == 1) then
  401.                         str = string.format(" %0.1f℃, %0.1f℃  -- OK ", y1, y2)  print(str)
  402.                 else
  403.                         str = string.format(" %0.1f℃, %0.1f℃  -- Err", y1, y2)  print(str)
  404.                         err = 9
  405.                         goto quit
  406.                 end        
  407.         end

  408.         --测试脉冲功能
  409.         if (Model == RC202_NORMAL or Model == RD202_PULSE) then
  410.                 str = string.format("\r\n【2】测试脉冲功能")  print(str)
  411.                 if (Model == RC202_NORMAL) then
  412.                         RegAddr = REG04_CH01_OUT_F + 4
  413.                 else
  414.                         RegAddr = REG04_CH01_OUT_F
  415.                 end
  416.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,RegAddr,2)
  417.                 if (err > 0) then
  418.                         goto quit
  419.                 end
  420.                
  421.                 if (y1 > 90 and y2 > 90 and y1 < 110 and y2 < 110 ) then
  422.                         str = string.format(" %0.2fHz, %0.2fHz  -- OK ", y1, y2)  print(str)
  423.                 else
  424.                         str = string.format(" %0.2fHz, %0.2fHz   -- Err", y1, y2)  print(str)
  425.                         err = 9
  426.                         goto quit
  427.                 end                        
  428.         end

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

  432.                 ConfigChanRange(1)        --切换到电压档位
  433.                                 
  434.                 --设置DAC电压
  435.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, 5000)
  436.                 if (err > 0) then goto quit end
  437.                 --切换继电器
  438.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 1, 0,0,0)
  439.                 if (err > 0) then goto quit end                                                
  440.                 delayms(1000)                        
  441.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F, 1)
  442.                 if (err > 0) then goto quit end
  443.                 if (math.abs(y1 - 5.0) < 0.02) then
  444.                         str = string.format(" CH1 5.000V, %0.3fV  -- OK ", y1)   print(str)
  445.                 else
  446.                         str = string.format(" CH1 5.000V, %0.3fV  -- Err ", y1)  print(str)
  447.                         err = 9
  448.                         goto quit        
  449.                 end

  450.                 --设置DAC电压
  451.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, 6000)
  452.                 if (err > 0) then goto quit end
  453.                 --切换继电器
  454.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 1,0,0)
  455.                 if (err > 0) then goto quit end                                                
  456.                 delayms(1000)                        
  457.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F + 2, 1)
  458.                 if (err > 0) then goto quit end
  459.                 if (math.abs(y1 - 6.0) < 0.02) then
  460.                         str = string.format(" CH2 6.000V, %0.3fV  -- OK ", y1)   print(str)
  461.                 else
  462.                         str = string.format(" CH2 6.000V, %0.3fV  -- Err ", y1)  print(str)
  463.                         err = 9
  464.                         goto quit        
  465.                 end

  466.                 print("")
  467.                 ConfigChanRange(0) --切换到电流档位
  468.                                 
  469.                 --设置DAC电流
  470.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, 12000)
  471.                 if (err > 0) then goto quit end
  472.                 --切换继电器
  473.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0,1,0)
  474.                 if (err > 0) then goto quit end                                                
  475.                 delayms(1000)                        
  476.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F, 1)
  477.                 if (err > 0) then goto quit end
  478.                 if (math.abs(y1 - 12.0) < 0.02) then
  479.                         str = string.format(" CH1 12.000mA, %0.3fmA  -- OK ", y1)   print(str)
  480.                 else
  481.                         str = string.format(" CH1 12.000mA, %0.3fmA  -- Err ", y1)  print(str)
  482.                         err = 9
  483.                         goto quit        
  484.                 end

  485.                 --设置DAC电流
  486.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, 10000)
  487.                 if (err > 0) then goto quit end
  488.                 --切换继电器
  489.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0,0,1)
  490.                 if (err > 0) then goto quit end                                                
  491.                 delayms(1000)                        
  492.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485, REG04_CH01_OUT_F + 2, 1)
  493.                 if (err > 0) then goto quit end
  494.                 if (math.abs(y1 - 10.0) < 0.02) then
  495.                         str = string.format(" CH2 10.000mA, %0.3fmA  -- OK ", y1)   print(str)
  496.                 else
  497.                         str = string.format(" CH2 10.000mA, %0.3fmA  -- Err ", y1)  print(str)
  498.                         err = 9
  499.                         goto quit        
  500.                 end                                                
  501.         end        

  502.         --测试继电器功能
  503.         if (Model == RC202_NORMAL or Model == RD202_PULSE) then
  504.                 str = string.format("\r\n【3】测试继电器功能")  print(str)
  505.                
  506.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,0)
  507.                 if (err > 0) then goto quit end               
  508.                 delayms(100)
  509.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  510.                 if (y1 == 0 and y2 == 0) then                        
  511.                         str = string.format(" y1 = 0(%d), y2 = 0(%d)  -- Ok ", y1, y2)  print(str)
  512.                 else
  513.                         str = string.format(" y1 = 0(%d), y2 = 0(%d)  -- Err ", y1, y2)  print(str)
  514.                         err = 9
  515.                         goto quit                                
  516.                 end
  517.                                                 
  518.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,1,0)
  519.                 if (err > 0) then goto quit end               
  520.                 delayms(100)
  521.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  522.                 if (y1 == 1 and y2 == 0) then                        
  523.                         str = string.format(" y1 = 1(%d), y2 = 0(%d)  -- Ok ", y1, y2)  print(str)        
  524.                 else        
  525.                         str = string.format(" y1 = 1(%d), y2 = 0(%d)  -- Err ", y1, y2)  print(str)
  526.                         err = 9
  527.                         goto quit               
  528.                 end        

  529.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,1)
  530.                 if (err > 0) then goto quit end               
  531.                 delayms(100)
  532.                 err,y1,y2 = modbus_read_di(COMx,TimeOut,RC604Addr,1,2)
  533.                 if (y1 == 0 and y2 == 1) then                        
  534.                         str = string.format(" y1 = 0(%d), y2 = 1(%d)  -- Ok ", y1, y2)  print(str)        
  535.                 else
  536.                         str = string.format(" y1 = 0(%d), y2 = 1(%d)  -- Err ", y1, y2)  print(str)
  537.                         err = 9
  538.                         goto quit               
  539.                 end                        

  540.                 err = modbus_write_do(COMx,TimeOut,Addr485,1,0,0)
  541.                 if (err > 0) then goto quit end               
  542.         end               
  543.                         
  544. ::quit::
  545.         if (err == 0) then
  546.                 PrintOk()
  547.                 time2 = get_runtime()
  548.                 time1 = (time2 - time1) / 1000
  549.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)
  550.         else
  551.                 if (err == 6) then
  552.                         print("RS485通信错误")
  553.                 else
  554.                         str = string.format("错误代码 = %d", err)        
  555.                         print(str)
  556.                 end
  557.                 PrintError()
  558.         end
  559. end

  560. function AutoTestRC608(void)
  561.         local err,y1,y2,y3,y4
  562.         local str
  563.         local time1,time2
  564.         local Model
  565.         local SoftVer
  566.         local RFHard
  567.         local RFSoft
  568.         local ModelStr = "xxxxx"
  569.         local RegAddr
  570.         local ch_num        
  571.         
  572.         print("-------开始测试--------------------------------------------")
  573.         time1 = get_runtime()
  574.         
  575.         uart_clear_rx(COMx)
  576.         
  577.         err =  modbus_write_u16(COMx, 1000, 1, 0x1007, 1)
  578.         
  579.         --读硬件型号和版本        
  580.         err,Model,SoftVer = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  581.         if (err > 0) then goto quit end
  582.         
  583.         uart_clear_rx(COMx)
  584.         err, RFHard, RFSoft = modbus_read_u16(COMx,TimeOut,Addr485,0x9009,2)
  585.         if (err > 0) then goto quit end
  586.         
  587.         if (Model == 0xC602) then
  588.                 ModelStr = "RC602"
  589.                 ch_num = 2
  590.         else
  591.                 if (Model == 0xC604) then
  592.                         ModelStr = "RC604"
  593.                         ch_num = 4
  594.                 else
  595.                         if (Model == 0xC608) then
  596.                                 ModelStr = "RC608"
  597.                                 ch_num = 8
  598.                         else
  599.                                 if (Model == 0xC612) then
  600.                                         ModelStr = "RC612"
  601.                                         ch_num = 12
  602.                                 else         
  603.                                         if (Model == 0xC616) then
  604.                                                 ModelStr = "RC616"
  605.                                                 ch_num = 16
  606.                                         else         
  607.                                                 if (Model == 0xC632) then
  608.                                                         ModelStr = "RC632"
  609.                                                         ch_num = 32
  610.                                                 else
  611.                                                         ch_num = -1
  612.                                                 end
  613.                                         end        
  614.                                 end        
  615.                         end
  616.                 end
  617.         end
  618.         
  619.         if (RFHard == 0) then ModelStr = ModelStr.."-XXX" end
  620.         if (RFHard == 1) then ModelStr = ModelStr.."-485" end
  621.         if (RFHard == 2) then ModelStr = ModelStr.."-232" end
  622.         if (RFHard == 0x30) then ModelStr = ModelStr.."-2K" end
  623.         if (RFHard == 0x31) then ModelStr = ModelStr.."-8K" end
  624.         
  625.         if (RFHard == 0x32) then  
  626.                 if ((RFSoft & 0xFF) == 0x14) then
  627.                         ModelStr = ModelStr.."-3K"
  628.                 else
  629.                         if ((RFSoft & 0xFF) == 0x1E) then
  630.                                 ModelStr = ModelStr.."-7K"
  631.                         else
  632.                                 ModelStr = ModelStr.."-xx"
  633.                         end
  634.                 end
  635.         end
  636.         
  637.         if (RFHard == 0x82) then ModelStr = ModelStr.."-WiFi" end
  638.         if (RFHard == 0x83) then ModelStr = ModelStr.."-NBIoT" end

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

  640.         if (ch_num > 0) then
  641.                 TestRC608(ch_num)
  642.         else
  643.         
  644.         end

  645.         if (RFHard == 0x30 or RFHard == 0x32) then
  646.                 delayms(500)
  647.                 Test433M()
  648.         end

  649. ::quit::
  650.         if (err == 0) then
  651.                 time2 = get_runtime()
  652.                 time1 = (time2 - time1) / 1000
  653.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)
  654.         else
  655.                 if (err == 6) then
  656.                         print("RS485通信错误")        
  657.                 end
  658.                 PrintError()
  659.         end        
  660. end

  661. --自动测试RC602 604 608 612 616 632
  662. function TestRC608(ch_num)
  663.         local err,y1,y2,y3,y4,y5,y6,y7,y8
  664.         local str
  665.         local time1,time2
  666.         local Model
  667.         local RegAddr
  668.         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}
  669.         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}
  670.         local i
  671.         local terr = 0
  672.         local strerr = ""
  673.         
  674.         time1 = get_runtime()

  675.         uart_clear_rx(COMx)
  676.         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)
  677.         if (err > 0) then goto quit end        
  678.         delayms(60)
  679.         for i = 0, ch_num - 1, 1 do                        
  680.                 RegAddr = 1 + i
  681.                
  682.                 uart_clear_rx(COMx)
  683.                 err, y1 = modbus_read_di(COMx,TimeOut,RC604Addr, RegAddr, 1)
  684.                 if (err > 0) then goto quit end               
  685.                
  686.                 uart_clear_rx(COMx)
  687.                 err = modbus_write_do(COMx,TimeOut,Addr485,RegAddr, 1)
  688.                 if (err > 0) then goto quit end               
  689.                 delayms(60)
  690.                 uart_clear_rx(COMx)
  691.                 err, y2 = modbus_read_di(COMx,TimeOut,RC604Addr, RegAddr, 1)               
  692.                 if (err > 0) then goto quit end               
  693.                
  694.                 if (y1 == 0 and y2 == 1) then                        
  695.                         --str = string.format(" Y%d  -- Ok ", i + 1)  print(str)
  696.                 else
  697.                         --str = string.format(" Y%d  -- Err %d,%d", i + 1, y1, y2)  print(str)
  698.                         err = 9
  699.                         terr = terr + 1               
  700.                         strerr = strerr..string.format("Y%d ", i + 1)
  701.                 end        
  702.         end               

  703.         print("")
  704.         uart_clear_rx(COMx)
  705.         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)
  706.         if (err > 0) then goto quit end        
  707.         delayms(60)
  708.         for i = 0, ch_num - 1, 1 do                        
  709.                 RegAddr = 1 + i
  710.                 uart_clear_rx(COMx)
  711.                 err, y1 = modbus_read_di(COMx,TimeOut,Addr485, RegAddr, 1)
  712.                 if (err > 0) then goto quit end               
  713.                
  714.                 uart_clear_rx(COMx)
  715.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,RegAddr, 1)
  716.                 if (err > 0) then goto quit end               
  717.                 delayms(60)
  718.                 uart_clear_rx(COMx)
  719.                 err, y2 = modbus_read_di(COMx,TimeOut,Addr485, RegAddr, 1)               
  720.                 if (err > 0) then goto quit end               
  721.                
  722.                 if (y1 == 0 and y2 == 1) then                        
  723.                         --str = string.format(" X%d  -- Ok ", i + 1)  print(str)
  724.                 else
  725.                         --str = string.format(" X%d  -- Err %d,%d", i + 1, y1, y2)  print(str)
  726.                         err = 9
  727.                         terr = terr + 1        
  728.                         strerr = strerr..string.format("X%d ", i + 1)                        
  729.                 end        
  730.         end               
  731.                         
  732. ::quit::
  733.         if (err == 0 and terr == 0) then
  734.                 print("-------IO测试OK----------")
  735.                 beep()
  736.         else
  737.                 if (err == 6) then
  738.                         print("RS485通信错误")
  739.                 else
  740.                         if (terr > 0) then
  741.                                 str = "错误:"..strerr        print(str)
  742.                         else
  743.                                 str = string.format(" 错误代码 = %d", terr)        print(str)
  744.                         end                        
  745.                 end
  746.                
  747.                 print("-------IO测试失败----------")
  748.                 beep(5,5,3)        
  749.         end
  750. end

  751. --检查433M射频功能
  752. function Test433M(void)
  753.         local err,y1,y2,y3,y4
  754.         local str
  755.         local COM_TTL = 7
  756.         local rx_len = 0
  757.         local rx_str = ""
  758.         
  759.         err = 0
  760.         err = err + modbus_write_u16(COMx, 1000, 1, 0x1007, 1)

  761.         gpio_cfg(0, 5)        -- 配置D0为UART功能
  762.         gpio_cfg(1, 5)        -- 配置D1为UART功能        
  763.         uart_cfg(COM_TTL, 9600, 0, 8, 1)        
  764.         
  765.         --D2 D3 = M0 M1 = 1 进入指令模式
  766.         gpio_cfg(2,1)
  767.         gpio_cfg(3,1)
  768.         gpio_write(2,1)
  769.         gpio_write(3,1)
  770.         
  771.         delayms(20)

  772.         uart_clear_rx(COM_TTL)

  773.         --0001 1111    0000 0000
  774.         uart_send(COM_TTL, "\xC2\xFF\xFF\x1F\x17\x00")
  775.         rx_len, rx_str = uart_recive(COM_TTL, 6, 100)
  776.         print_hex(rx_len, rx_str)        

  777.         --M0 M1 = 0 进入工作状态
  778.         gpio_write(2,0)
  779.         gpio_write(3,0)
  780.         delayms(20)

  781.         err = err + modbus_write_do(COM_TTL,1000, 1, 1, 1)
  782.         delayms(100)
  783.         err = err + modbus_write_do(COM_TTL,1000, 1, 1, 0)
  784.         
  785.         err = err + modbus_write_u16(COMx, 1000, 1, 0x1007, 3)
  786.                
  787.         if (err > 0) then
  788.                 print("-------433M测试失败----------")
  789.                 beep(5,5,3)        
  790.         else
  791.                 print("-------433M测试OK----------")
  792.                 beep()
  793.         end               
  794.         
  795.                         
  796.         
  797. end

  798. ------------------------------------------------------

  799. --检查一个值是否在公差范围 1表示err 0表示ok
  800. function check_err(data, mid, diff)
  801.         local re
  802.         local dd

  803.         if (mid < 0) then
  804.                 dd = -mid * diff
  805.         else
  806.                 dd = mid * diff
  807.         end
  808.         
  809.         if ((data >= mid - dd) and  (data <= mid + dd)) then
  810.                 re = 0
  811.         else
  812.                 re = 1
  813.         end
  814.         return re
  815. end
  816.         
  817. --校准  返回0表示0K, 1表示错误
  818. function Calib402(void)
  819.         local Model
  820.         local err,y1,y2,y3,y4
  821.         local x1,x2,K,B
  822.         local str
  823.         local time1,time2
  824.         local RegAddr
  825.         local adc1
  826.         local adc2
  827.         local Temp
  828.         local i
  829.         local VoltAdc1 = 1202
  830.         local VoltAdc2 = 2860
  831.         local CurrAdc1 = 615
  832.         local CurrAdc2 = 2923
  833.         local DIFF = 0.05
  834.         
  835.         print("-------开始校准------------------------------------")
  836.         time1 = get_runtime()

  837.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,RC604Addr,0x9000,2)
  838.         if (err > 0) then
  839.                 str = string.format("未找到工装RC604") print(str)
  840.                 goto quit
  841.         end
  842.         
  843.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,RC302Addr,0x9000,2)        
  844.         if (err > 0) then
  845.                 str = string.format("未找到工装RC302") print(str)
  846.                 goto quit
  847.         end
  848.         
  849.         --初始化基本参数和模拟通道配置参数
  850.         err = modbus_write_u16(COMx,2000,Addr485,0x9100,0x5A50)
  851.         if (err > 0) then
  852.                 str = string.format("初始化基本参数和模拟通道配置参数失败") print(str)
  853.                 goto quit
  854.         else
  855.                 str = string.format("初始化基本参数和模拟通道配置参数 ok") print(str)
  856.         end        

  857.         --初始化模拟量校准参数
  858.         err = modbus_write_u16(COMx,3000,Addr485,0x9100,0x5AA0)
  859.         if (err > 0) then
  860.                 str = string.format("初始化模拟量校准参数失败") print(str)
  861.                 goto quit
  862.         else
  863.                 str = string.format("初始化模拟量校准参数 ok") print(str)
  864.         end        
  865.         print("")
  866.         
  867.         --读硬件型号和版本        
  868.         err,y1,y2 = modbus_read_u16(COMx,TimeOut,Addr485,0x9000,2)
  869.         if (err > 0) then goto quit end
  870.         str = string.format("型号 = %04X 固件版本 = V%X.%02X", y1, y2 >> 8, y2 & 0xFF) print(str)
  871.         
  872.         Model = y1
  873.         
  874.         if (Model == RC202_NORMAL) then
  875.                 str = string.format("已识别机型: RC602")  print(str)
  876.         else
  877.                 if (Model == RD202_20MA) then
  878.                         str = string.format("已识别机型: RD202-20MA")  print(str)               
  879.                 else
  880.                         if (Model == RD202_18B20) then
  881.                                 str = string.format("已识别机型: RD202-18B20")  print(str)
  882.                         else
  883.                                 if (Model == RD202_PULSE) then
  884.                                         str = string.format("已识别机型: RD202-PULSE")  print(str)
  885.                                 else
  886.                                         if (Model == 0xC402) then
  887.                                                 str = string.format("已识别机型: RC402")  print(str)                                       
  888.                                         else
  889.                                                 str = string.format("未知机型")  print(str)
  890.                                                 goto quit
  891.                                         end
  892.                                 end
  893.                         end
  894.                 end
  895.         end
  896.         
  897.         if (Model ~= RC202_NORMAL and Model ~= RD202_20MA and Model ~= 0xC402) then
  898.                 str = string.format(" 该型号无需模拟量校准")  print(str)
  899.                 goto quit        
  900.         end
  901.                
  902.         err = modbus_write_u16(COMx,TimeOut,Addr485,REG06_CALIB_KEY, 0x55AA)
  903.         if (err > 0) then goto quit end
  904.         --print("校准开关已打开")

  905.         --print("--校准零位...")
  906.                 --切换继电器
  907.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1,0,0,0,0)
  908.                 if (err > 0) then goto quit end        
  909.                
  910.                 delayms(1000)
  911.                         
  912.                 err,y1,y2 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_AVG, 2)
  913.                 if (err > 0) then goto quit end               
  914.                 if (check_err(y1, 0.5, 1) == 1) then
  915.                         str = string.format(" CH1 零位ADC = %f --- Err", y1) print(str)
  916.                         err = 9
  917.                         goto quit
  918.                 end
  919.                 if (check_err(y2, 0.5, 1) == 1) then
  920.                         str = string.format(" CH2 零位ADC = %f --- Err", y1) print(str)
  921.                         err = 9
  922.                         goto quit
  923.                 end                                                        
  924.                
  925.                 --写通道1零位ADC,2个量程ADC一样
  926.                 RegAddr =         REG03_CC01_K0 + CC01_ZERO_ADC_0;
  927.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y1)
  928.                 if (err > 0) then goto quit end        

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

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

  936.                 RegAddr =         REG03_CC01_K0 + CALIB_REG_STEP + CC01_ZERO_ADC_0 + RANGE_REG_STEP;
  937.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, y2)
  938.                 if (err > 0) then goto quit end                        
  939.                
  940.                 str = string.format(" CH1 CH2 零位ADC = %f, %f --OK", y1, y2) print(str)
  941.         
  942.         --读取NTC温度
  943.         err, Temp = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_OUT_F + 12,1)
  944.         if (err > 0) then goto quit end               
  945.         str = string.format(" NTC温度 = %f ℃", Temp) print(str)
  946.         
  947.         --校准2个通道的电压档位
  948.         for i = 0, 1, 1 do                                

  949.                 str = string.format("\r\n校准通道%d电压,第1点 %dmV, 第2点 %dmV", i + 1, CALIB_VOTL1, CALIB_VOTL2)        
  950.                 print(str)
  951.                
  952.                 --切换继电器 电压
  953.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 1 - i, i,0,0)
  954.                 if (err > 0) then
  955.                         goto quit
  956.                 end        
  957.                         
  958.                 --设置DAC电压 - 校准点1
  959.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, CALIB_VOTL1)
  960.                 if (err > 0) then
  961.                         goto quit
  962.                 end
  963.                
  964.                 delayms(1000)
  965.                
  966.                 err,y1 = modbus_read_float(COMx,TimeOut, Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  967.                 if (err > 0) then goto quit end                                       
  968.                 --str = string.format("  RMS_ADC = %f", y1) print(str)
  969.                
  970.                 --保存第1点adc
  971.                 adc1 = y1
  972.                 if (check_err(adc1, VoltAdc1, DIFF) == 1) then
  973.                         str = string.format(" CH%d电压Adc1 = %f -- Err (ok = %f)", i + 1, y1, VoltAdc1) print(str)
  974.                         err = 9
  975.                         goto quit        
  976.                 else
  977.                         str = string.format(" CH%d电压Adc1 = %f -- Ok", i + 1, y1) print(str)
  978.                 end

  979.                 --str = string.format("\r\n校准通道%d电压,第2点 %dmV", i + 1, CALIB_VOTL2) print(str)
  980.                 --设置DAC电压 - 校准点2
  981.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_VOLT_01, CALIB_VOTL2)
  982.                 if (err > 0) then
  983.                         goto quit
  984.                 end
  985.                
  986.                 delayms(1000)
  987.                
  988.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  989.                 if (err > 0) then goto quit end                                       
  990.                 --str = string.format("  RMS_ADC = %f", y1) print(str)
  991.                
  992.                 --保存第2点adc
  993.                 adc2 = y1
  994.                 if (check_err(adc2, VoltAdc2, DIFF) == 1) then
  995.                         str = string.format(" CH%d电压Adc2 = %f -- Err (ok = %f)", i + 1, y1, VoltAdc2) print(str)
  996.                         err = 9
  997.                         goto quit        
  998.                 else
  999.                         str = string.format(" CH%d电压Adc2 = %f -- Ok", i + 1, y1) print(str)
  1000.                 end                        
  1001.                                 
  1002.                 --计算K,B        
  1003.                 x1 = adc1
  1004.                 y1 = CALIB_VOTL1 / 1000
  1005.                 x2 = adc2
  1006.                 y2 = CALIB_VOTL2 / 1000               
  1007.                
  1008.                 K = (y2 - y1) / (x2 - x1);
  1009.                 B = (x2 * y1 - x1 * y2)/(x2 - x1);               
  1010.                
  1011.                 str = string.format(" X1 = %f, X2 = %f, X2 = %f, Y2 = %f",x1,y1,x2,y2) print(str)
  1012.                 str = string.format(" K = %f, B = %f", K, B) print(str)
  1013.                                                 
  1014.                 RegAddr = REG03_CC01_K0 + i * CALIB_REG_STEP + RANGE_REG_STEP + CC01_K_0
  1015.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, K,B,Temp,0,0)
  1016.                 if (err > 0) then goto quit end        
  1017.                 str = string.format(" 通道%d电压档校准参数写入成功", i + 1) print(str)
  1018.         end        

  1019.         --校准电流档位
  1020.         print("")
  1021.         
  1022.         for i = 0, 1, 1 do                                
  1023.                 --校准通道1电流
  1024.                 str = string.format("\r\n校准通道%d电流,第1点 %fmA  第2点 %fmA", i + 1, CALIB_CURR1 / 1000, CALIB_CURR2 / 1000)        
  1025.                 print(str)
  1026.                
  1027.                 --切换继电器 电压
  1028.                 err = modbus_write_do(COMx,TimeOut,RC604Addr,1, 0, 0, 1 - i, i)
  1029.                 if (err > 0) then
  1030.                         goto quit
  1031.                 end        
  1032.                         
  1033.                 --设置DAC电压 - 校准点1
  1034.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, CALIB_CURR1)
  1035.                 if (err > 0) then
  1036.                         goto quit
  1037.                 end
  1038.                
  1039.                 delayms(1000)
  1040.                
  1041.                 err,y1 = modbus_read_float(COMx,TimeOut, Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  1042.                 if (err > 0) then goto quit end                                       
  1043.                 --str = string.format("  RMS_ADC = %f", y1) print(str)
  1044.                
  1045.                 --保存第1点adc
  1046.                 adc1 = y1
  1047.                 if (check_err(adc1, CurrAdc1, DIFF) == 1) then
  1048.                         str = string.format("  CH%d电流Adc1 = %f -- Err (ok = %f)", i + 1, y1, CurrAdc1) print(str)
  1049.                         err = 9
  1050.                         goto quit        
  1051.                 else
  1052.                         str = string.format("  CH%d电流Adc1 = %f -- Ok", i + 1, y1) print(str)
  1053.                 end                        

  1054.                 --str = string.format("\r\n校准通道%d电流,第1点 %duA", i + 1, CALIB_CURR2)        print(str)
  1055.                 --设置DAC电压 - 校准点2
  1056.                 err = modbus_write_u16(COMx,TimeOut,RC302Addr,REG03_AO_CURR_01, CALIB_CURR2)
  1057.                 if (err > 0) then
  1058.                         goto quit
  1059.                 end
  1060.                
  1061.                 delayms(1000)
  1062.                
  1063.                 err,y1 = modbus_read_float(COMx,TimeOut,Addr485,REG04_CH01_ADC_RMS + 2 * i, 2)
  1064.                 if (err > 0) then goto quit end                                       
  1065.                 --str = string.format("  RMS_ADC = %f", y1) print(str)
  1066.                
  1067.                 --保存第2点adc
  1068.                 adc2 = y1               
  1069.                 if (check_err(adc2, CurrAdc2, DIFF) == 1) then
  1070.                         str = string.format("  CH%d电流Adc2 = %f -- Err (ok = %f)", i + 1, y1, CurrAdc2) print(str)
  1071.                         err = 9
  1072.                         goto quit        
  1073.                 else
  1074.                         str = string.format("  CH%d电流Adc2 = %f -- Ok", i + 1, y1) print(str)
  1075.                 end        
  1076.                                                 
  1077.                 --计算K,B        
  1078.                 x1 = adc1
  1079.                 y1 = CALIB_CURR1 / 1000
  1080.                 x2 = adc2
  1081.                 y2 = CALIB_CURR2 / 1000               
  1082.                
  1083.                 K = (y2 - y1) / (x2 - x1);
  1084.                 B = (x2 * y1 - x1 * y2)/(x2 - x1);               
  1085.                
  1086.                 str = string.format(" X1 = %f, X2 = %f, X2 = %f, Y2 = %f",x1,y1,x2,y2) print(str)
  1087.                 str = string.format(" K = %f, B = %f", K, B) print(str)
  1088.                                                 
  1089.                 RegAddr = REG03_CC01_K0 + i * CALIB_REG_STEP + 0 * RANGE_REG_STEP + CC01_K_0
  1090.                 err = modbus_write_float(COMx,TimeOut,Addr485, RegAddr, K,B,Temp,0,0)
  1091.                 if (err > 0) then goto quit end        
  1092.                 str = string.format("--通道%d电流档校准参数写入成功", i + 1) print(str)
  1093.         end        
  1094.                
  1095. ::quit::
  1096.         if (err == 0) then
  1097.                 print("-------校准成功------------------------------------")
  1098.                 time2 = get_runtime()
  1099.                 time1 = (time2 - time1) / 1000
  1100.                 str = string.format("  执行时间 = %0.1f 秒", time1)           print(str)        
  1101.                 return 0
  1102.         else
  1103.                 if (err == 6) then
  1104.                         print("RS485通信错误")
  1105.                 else
  1106.                         str = string.format("错误代码 = %d", err)        
  1107.                         print(str)
  1108.                 end
  1109.                 PrintError()
  1110.                 return 1
  1111.         end
  1112. end
复制代码













评分

参与人数 1金币 +20 收起 理由
byccc + 20 赞一个!

查看全部评分

回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2020-4-13 10:18:40 | 显示全部楼层
在我的产品上也试试。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 01:10 , Processed in 0.227601 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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