Compare commits
5 Commits
ac71522cc2
...
524af160d8
Author | SHA1 | Date | |
---|---|---|---|
524af160d8 | |||
aedac4c90c | |||
4e4d760db4 | |||
ad4b6ae8d6 | |||
fc3d5482f8 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,4 +6,5 @@ aio/package/
|
|||||||
aio/venv
|
aio/venv
|
||||||
aio/__pycache__/
|
aio/__pycache__/
|
||||||
aio/code/automatic_test/__pycache__/
|
aio/code/automatic_test/__pycache__/
|
||||||
aio/code/data_process/__pycache__/
|
aio/code/data_process/__pycache__/
|
||||||
|
aio/assets/templates/c_msg.log
|
@ -367,8 +367,57 @@ v0.1.7.1.1(2024/06/29)
|
|||||||
- 规定了所有的网络异常均由heartbeat函数来定义,其他异常不做中断处理
|
- 规定了所有的网络异常均由heartbeat函数来定义,其他异常不做中断处理
|
||||||
- execution函数中合并了case条件
|
- execution函数中合并了case条件
|
||||||
- 增加了N多指令,多为诊断曲线和rl程序相关
|
- 增加了N多指令,多为诊断曲线和rl程序相关
|
||||||
|
- 日志保留条数修改为20000
|
||||||
3. [APIs: do_brake.py]
|
3. [APIs: do_brake.py]
|
||||||
- 实现自动推送工程到xCore并自动运行
|
- 实现自动推送工程到xCore并自动运行
|
||||||
- 初步实现了Modbus发送消息和检测状态
|
- 初步实现了Modbus发送消息和检测状态
|
||||||
4. [APIs: do_current.py]
|
4. [APIs: do_current.py]
|
||||||
- 将do_brake.py的内容完全拷贝到此文件,待修改
|
- 将do_brake.py的内容完全拷贝到此文件,待修改
|
||||||
|
|
||||||
|
v0.1.7.2(2024/06/30)
|
||||||
|
1. 初步完成NB4h_R580_3BH7.zip工程的设计
|
||||||
|
2. 重新研究了解包操作,重新实现了一版
|
||||||
|
3. 修改openapi.pi中excution为execution函数
|
||||||
|
4. 增加了解包原理性文档
|
||||||
|
|
||||||
|
v0.1.7.3(2024/07/01)
|
||||||
|
1. [APIs: openapi.py]
|
||||||
|
- 继续完善封包解包操作,并优化了所有调试信息,默认打开状态,直到bug数量明显减少
|
||||||
|
- 修复了两个bug,删除了一个多余的break,另一个是补齐了self.broke的重置
|
||||||
|
2. [APIs: do_current.py] 使用原工程的工程名进行move操作,语义更加明确
|
||||||
|
|
||||||
|
> 目前看openapi.py封包解包没有任何问题了,但是所有的调试信息都默认打开,以便可以第一时间保留现场
|
||||||
|
> 打开诊断,跑了10多分钟,共计解包没有报错,应该是没有问题了
|
||||||
|
|
||||||
|
v0.1.7.4(2024/07/02)
|
||||||
|
1. [APIs: openapi.py]
|
||||||
|
- 增加了modbus的python实现
|
||||||
|
- heartbeat函数修改发送间隔为1s
|
||||||
|
- 清除了绝大部分调试性输出,发现太多的这种输出也会导致心跳丢包...,不清楚这个原理是什么
|
||||||
|
- 在get_response函数中的while self.pkg > 0循环中,删除了else语句,因为它永不会被执行到
|
||||||
|
- 在get_response函数中,修复一个bug,在flag==0的else语句中,补齐了index==6的情况
|
||||||
|
2. [APIs: do_current.py]
|
||||||
|
- 完成了六个轴的电机电流动作的执行,以及数据采集
|
||||||
|
- 完成了对应的RL程序的编写
|
||||||
|
3[APIs: aio.py]
|
||||||
|
- 引入modbus实例化,并以参数的形式,传递给相应的tabview
|
||||||
|
- 新增pre_warning函数,在做自动化测试之前,确保所有条件皆具备
|
||||||
|
|
||||||
|
v0.1.7.5(2024/07/03)
|
||||||
|
1. [APIs: aio.py]
|
||||||
|
- 增加触发急停和恢复急停功能逻辑
|
||||||
|
2. [APIs: do_current.py]
|
||||||
|
- 重新调整运行顺序,增加数据处理的逻辑(惯量负载逻辑暂不实现,等待软件部解决了修改工程之后不生效的问题再考虑)
|
||||||
|
3. [APIs: btn_functions.py]
|
||||||
|
- 增加触发急停和恢复急停的modbus实现,仅适用于自动化测试
|
||||||
|
|
||||||
|
v0.1.7.6(2024/07/04)
|
||||||
|
1. [APIs: aio.py]
|
||||||
|
- Automatic Test逻辑中增加选择current时,需要选负载类型的逻辑
|
||||||
|
2. [APIs: do_current.py]
|
||||||
|
- 单轴/场景电机电流的采集已完成
|
||||||
|
3. [APIs: openapi.py]
|
||||||
|
- 增加了modbus读取浮点数的功能
|
||||||
|
- 优化了get_from_id的逻辑
|
||||||
|
4. [autotest.xml]: 新增了scenario_time只写寄存器
|
||||||
|
|
||||||
|
947
aio/assets/autotest.xml
Normal file
947
aio/assets/autotest.xml
Normal file
@ -0,0 +1,947 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<m>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40000"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="清除伺服报警"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40000"/>
|
||||||
|
<c name="function" type="10" value="ctrl_clear_alarm"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_clear_alarm"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40001"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="重置软急停"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40001"/>
|
||||||
|
<c name="function" type="10" value="ctrl_estop_reset"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_reset_estop"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40002"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="下电"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40002"/>
|
||||||
|
<c name="function" type="10" value="ctrl_motor_off"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_moror_off"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40003"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="上电"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40003"/>
|
||||||
|
<c name="function" type="10" value="ctrl_motor_on"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_motor_on"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40004"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="上电或者下电"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40004"/>
|
||||||
|
<c name="function" type="10" value="ctrl_motor_on_off"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_motor_on_off"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40005"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="上电/pp2main/start"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40005"/>
|
||||||
|
<c name="function" type="10" value="ctrl_motoron_pptomain_start"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_on_pp_start"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40006"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="依次上电/启动程序"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40006"/>
|
||||||
|
<c name="function" type="10" value="ctrl_motoron_start"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_motoron_start"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40007"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="暂停程序并下电"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40007"/>
|
||||||
|
<c name="function" type="10" value="ctrl_pause_motoroff"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_pause_off"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40008"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="pp2main"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40008"/>
|
||||||
|
<c name="function" type="10" value="ctrl_pptomain"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_pp2main"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40009"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="开始运行程序"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40009"/>
|
||||||
|
<c name="function" type="10" value="ctrl_program_start"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_p_start"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40010"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="程序启停"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40010"/>
|
||||||
|
<c name="function" type="10" value="ctrl_program_start_stop"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_p_on_off"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40011"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="暂停程序"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40011"/>
|
||||||
|
<c name="function" type="10" value="ctrl_program_stop"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_p_stop"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40012"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="触发软急停"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40012"/>
|
||||||
|
<c name="function" type="10" value="ctrl_soft_estop"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_trigger_estop"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40013"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="切换自动并上电"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40013"/>
|
||||||
|
<c name="function" type="10" value="ctrl_switch_auto_motoron"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_auto_motoron"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40014"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="切换成自动模式"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40014"/>
|
||||||
|
<c name="function" type="10" value="ctrl_switch_operation_auto"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_switch_auto"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40015"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="切换手动和自动"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40015"/>
|
||||||
|
<c name="function" type="10" value="ctrl_switch_operation_auto_manu"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_auto_manual"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40016"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="切换成手动模式"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40016"/>
|
||||||
|
<c name="function" type="10" value="ctrl_switch_operation_manu"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="r_mtcp_switch_manual"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40500"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="错误码"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40500"/>
|
||||||
|
<c name="function" type="10" value="ext_error_code"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_error_code"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="int16"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40501"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="执行完毕的响应"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40501"/>
|
||||||
|
<c name="function" type="10" value="ext_resp_set"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_response"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40502"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value=""/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40509"/>
|
||||||
|
<c name="function" type="10" value="ext_response_data"/>
|
||||||
|
<c name="len" type="2" value="8"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_resp_data"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="int16"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40510"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="伺服告警状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40510"/>
|
||||||
|
<c name="function" type="10" value="sta_alarm"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_alarm_state"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40511"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="碰撞状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40511"/>
|
||||||
|
<c name="function" type="10" value="sta_collision"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_collision"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40512"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="碰撞告警"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40512"/>
|
||||||
|
<c name="function" type="10" value="sta_collision_alarm"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_c_alarm"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40513"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="碰撞检测开启状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40513"/>
|
||||||
|
<c name="function" type="10" value="sta_collision_open"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_c_open"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40514"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="控制器是否运行"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40514"/>
|
||||||
|
<c name="function" type="10" value="sta_controller_is_running"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_ctl_running"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40515"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="编码器欠压告警"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40515"/>
|
||||||
|
<c name="function" type="10" value="sta_encoder_low_battery"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_encoder_low"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40516"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="机器人上报错误码"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40516"/>
|
||||||
|
<c name="function" type="10" value="sta_error_code"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_robot_err"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="int16"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40517"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="急停状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40517"/>
|
||||||
|
<c name="function" type="10" value="sta_estop"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_estop"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40518"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="是否有心跳信号"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40518"/>
|
||||||
|
<c name="function" type="10" value="sta_heartbeat"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_heartbeat"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40519"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="上电状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40519"/>
|
||||||
|
<c name="function" type="10" value="sta_motor"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_motor"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40520"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="操作模式"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40520"/>
|
||||||
|
<c name="function" type="10" value="sta_operation_mode"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_mode"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40521"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="当前程序状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40521"/>
|
||||||
|
<c name="function" type="10" value="sta_program"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_p_state"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40522"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="软急停状态"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40522"/>
|
||||||
|
<c name="function" type="10" value="sta_soft_estop"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_s_estop"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40523"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="查询当前笛卡尔位姿"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40536"/>
|
||||||
|
<c name="function" type="10" value="sta_cart_pose"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_cart_pose"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40537"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="查询当前笛卡尔速度"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40550"/>
|
||||||
|
<c name="function" type="10" value="sta_cart_vel"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_cart_vel"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40551"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="关节角度"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40564"/>
|
||||||
|
<c name="function" type="10" value="sta_jnt_pose"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_jnt_pose"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40565"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="关节力矩"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40578"/>
|
||||||
|
<c name="function" type="10" value="sta_jnt_trq"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_jnt_trq"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40579"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="关节速度"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40592"/>
|
||||||
|
<c name="function" type="10" value="sta_jnt_vel"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_jnt_vel"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40593"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="tcp位姿"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40606"/>
|
||||||
|
<c name="function" type="10" value="sta_tcp_pose"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_tcp_pose"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40607"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="tcp速度"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40620"/>
|
||||||
|
<c name="function" type="10" value="sta_tcp_vel"/>
|
||||||
|
<c name="len" type="2" value="7"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_tcp_vel"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value">
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
<l type="10" value=""/>
|
||||||
|
</c>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="40621"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="tcp合成线速度"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="40622"/>
|
||||||
|
<c name="function" type="10" value="sta_tcp_vel_mag"/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="w_mtcp_vel_mag"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="41000"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="pc to robot"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="41000"/>
|
||||||
|
<c name="function" type="10" value=""/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="act"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rd"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="41001"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="robot to pc"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="41001"/>
|
||||||
|
<c name="function" type="10" value=""/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="ready_to_go"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="bool"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
<c name="bias" type="2" value="0"/>
|
||||||
|
</l>
|
||||||
|
<l>
|
||||||
|
<c name="addr" type="2" value="41002"/>
|
||||||
|
<c name="addr_1st" type="2" value="0"/>
|
||||||
|
<c name="addr_2nd" type="2" value="0"/>
|
||||||
|
<c name="bit_bias" type="2" value="0"/>
|
||||||
|
<c name="byte_bias" type="4" value="0"/>
|
||||||
|
<c name="description" type="10" value="robot to pc"/>
|
||||||
|
<c name="dev_name" type="10" value="autotest"/>
|
||||||
|
<c name="dev_type" type="10" value="MODBUS"/>
|
||||||
|
<c name="end_addr" type="2" value="41003"/>
|
||||||
|
<c name="function" type="10" value=""/>
|
||||||
|
<c name="len" type="2" value="1"/>
|
||||||
|
<c name="name" type="10" value="scenario_time"/>
|
||||||
|
<c name="retain" type="1" value="false"/>
|
||||||
|
<c name="rw" type="10" value="rdwr"/>
|
||||||
|
<c name="type" type="10" value="float"/>
|
||||||
|
<c name="value"/>
|
||||||
|
<c name="value_single" type="10" value=""/>
|
||||||
|
</l>
|
||||||
|
</m>
|
@ -1 +1 @@
|
|||||||
0
|
1
|
38
aio/assets/unpackage_logic.txt
Normal file
38
aio/assets/unpackage_logic.txt
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
b'\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340\x01o429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17\n\t\t\t]\n\t\t}\n\t],\n\t"module" : "robot"\n}\x04\x00\x00\x00-h\x02\x00{\n\t"command" : "diagnosis.result",\n\t"data" : \n\t[\n\t\t{\n\t\t\t"channel" : 0,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0'
|
||||||
|
b'.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 1,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t6.7411265092630715e-06,\n\t\t\t\t0.00049929277011941824,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0027270103772138884,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t0.00012044146029883355,\n\t\t\t\t-0.0022272681986605192,\n\t\t\t\t-0.0027270103772138884,\n\t\t\t\t0.0020686270214758614,\n\t\t\t\t-0.0027270103772138884,\n\t\t\t\t0.0020686270214758614,\n\t\t\t\t1.3482253018526145e-06,\n\t\t\t\t-0.002697798\x04\x008290070812,\n\t\t\t\t0.00050648330506263212,\n\t\t\t\t-0.0,\n\t\t\t\t0.0020753681479851243,\n\t\t\t\t2.8762139772855775e-05,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t3.5952674716069715e-05,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t0.0001496530085056402,\n\t\t\t\t0.0001276319952420475,\n\t\t\t\t-0.0027252127434780845,\n\t\t\t\t6.7411265092630715e-06,\n\t\t\t\t-0.0026977988290070812,\n\t\t\t\t8.5387602450665581e-06,\n\t\t\t\t0.0020686270214758614,\n\t\t\t\t0.00206862702147'
|
||||||
|
b'58614,\n\t\t\t\t-0.0,\n\t\t\t\t7.1905349432139438e-06,\n\t\t\t\t1.3482253018526145e-06,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t2.8762139772855775e-05,\n\t\t\t\t-0.0,\n\t\t\t\t6.7411265092630715e-06,\n\t\t\t\t-0.0,\n\t\t\t\t0.00049929277011941824,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 2,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t1.1984224905356572e-06,\n\t\t\t\t0.00010705907582118537,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0024236097500266104,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0024240092241901226,\n\t\t\x04\x00\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t0.0018387795746452099,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t0.00010705907582118537,\n\t\t\t\t-0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 3,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t'
|
||||||
|
b'-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.00021840051467521813,\n\t\t\t\t-0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 4,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t-0.0,\n\t\t\t\t-0.0\x04\x00,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n'
|
||||||
|
b'\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 5,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-\x04\x000.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0,\n\t\t\t\t-0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 0,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t'
|
||||||
|
b'\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 1,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0\x04\x00.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 2,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.'
|
||||||
|
b'0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 3,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\x04\x00\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 4,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n'
|
||||||
|
b'\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 5,\n\t\t\t"name" : "device_servo_trq_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.\x04\x000,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 0,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n'
|
||||||
|
b'\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 1,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1\x04\x00.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 2,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.'
|
||||||
|
b'0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 3,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t\x04\x001.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0,\n\t\t\t\t1.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 4,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : '
|
||||||
|
b'\n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t"channel" : 5,\n\t\t\t"name" : "device_safety_estop",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5\x04\x00.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429'
|
||||||
|
b'065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.55163404\x01n29065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17\n\t\t\t]\n\t\t}\n\t],\n\t"module" : "robot"\n}\x04\x00\x00\x00-\x8f\x02\x00{\n\t"command"'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\x04\x00\x00\x00-h\x02\x00
|
||||||
|
|
||||||
|
pkg_size = 11624
|
||||||
|
|
||||||
|
10240 + 402 + 1004 - 20 - 2(首个帧头) = 11624
|
||||||
|
|
||||||
|
第一帧有效 - 402
|
||||||
|
b'{\n\t"command" : "diagnosis.result",\n\t"data" : \n\t[\n\t\t{\n\t\t\t"channel" : 0,\n\t\t\t"name" : "hw_joint_vel_feedback",\n\t\t\t"value" : \n\t\t\t[\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0.0,\n\t\t\t\t0'
|
||||||
|
|
||||||
|
中间有 10 帧,共计 10240 个字节,也有 10 个 \x04\x00,共计 20 个字节
|
||||||
|
|
||||||
|
最后一帧有效 - 1004
|
||||||
|
b'065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.55163404\x01n29065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17,\n\t\t\t\t-5.5516340429065717e-17\n\t\t\t]\n\t\t}\n\t],\n\t"module" : "robot"\n}'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
b'\x00\\\x00\x00\x00V\x02\x00{\n\t"data" : \n\t{\n\t\t"name" : "xCore"\n\t},\n\t"id" : "controller.heart-1719734550.9790015"\n}'
|
||||||
|
|
||||||
|
frame size 92
|
||||||
|
package size 86
|
||||||
|
length 86 {\n\t"data" : \n\t{\n\t\t"name" : "xCore"\n\t},\n\t"id" : "controller.heart-1719734550.9790015"\n}'
|
@ -43,6 +43,8 @@ class App(customtkinter.CTk):
|
|||||||
self.my_font = customtkinter.CTkFont(family="Consolas", size=16, weight="bold")
|
self.my_font = customtkinter.CTkFont(family="Consolas", size=16, weight="bold")
|
||||||
self.w_param = 84
|
self.w_param = 84
|
||||||
self.hr = None
|
self.hr = None
|
||||||
|
self.md_at = None
|
||||||
|
self.md_dp = None
|
||||||
# =====================================================================
|
# =====================================================================
|
||||||
# configure window
|
# configure window
|
||||||
self.title("AIO - All in one automatic toolbox")
|
self.title("AIO - All in one automatic toolbox")
|
||||||
@ -114,7 +116,7 @@ class App(customtkinter.CTk):
|
|||||||
# create buttons
|
# create buttons
|
||||||
self.seg_button = customtkinter.CTkSegmentedButton(self.tabview.tab('Automatic Test'), dynamic_resizing=False, font=customtkinter.CTkFont(size=16, weight='bold'), command=lambda value='机器状态': self.thread_it(self.segmented_button_callback))
|
self.seg_button = customtkinter.CTkSegmentedButton(self.tabview.tab('Automatic Test'), dynamic_resizing=False, font=customtkinter.CTkFont(size=16, weight='bold'), command=lambda value='机器状态': self.thread_it(self.segmented_button_callback))
|
||||||
self.seg_button.grid(row=1, column=2, columnspan=12, padx=(20, 10), pady=(10, 10), sticky="ew")
|
self.seg_button.grid(row=1, column=2, columnspan=12, padx=(20, 10), pady=(10, 10), sticky="ew")
|
||||||
self.seg_button.configure(dynamic_resizing=False, values=["功能切换", "触发急停", "停止运动", "继续运动", "零点位姿", "机器状态", "告警信息"])
|
self.seg_button.configure(dynamic_resizing=False, values=["功能切换", "触发急停", "恢复急停", "待定功能", "功能待定", "机器状态", "告警信息"])
|
||||||
self.seg_button.set("功能切换")
|
self.seg_button.set("功能切换")
|
||||||
# create progress bar
|
# create progress bar
|
||||||
self.progressbar = customtkinter.CTkProgressBar(self.tabview.tab('Automatic Test'))
|
self.progressbar = customtkinter.CTkProgressBar(self.tabview.tab('Automatic Test'))
|
||||||
@ -130,7 +132,7 @@ class App(customtkinter.CTk):
|
|||||||
widgits_at[widgit]['entry'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col']+1, columnspan=11, padx=(5, 10), pady=5, sticky='we')
|
widgits_at[widgit]['entry'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col']+1, columnspan=11, padx=(5, 10), pady=5, sticky='we')
|
||||||
widgits_at[widgit]['entry'].configure(state='disabled')
|
widgits_at[widgit]['entry'].configure(state='disabled')
|
||||||
elif widgit in ['loadsel', ]:
|
elif widgit in ['loadsel', ]:
|
||||||
widgits_at[widgit]['optionmenu'] = customtkinter.CTkOptionMenu(self.tabview.tab('Automatic Test'), button_color='#708090', fg_color='#778899', values=["tool33", "tool66", "tool100"], width=self.w_param, font=self.my_font)
|
widgits_at[widgit]['optionmenu'] = customtkinter.CTkOptionMenu(self.tabview.tab('Automatic Test'), button_color='#708090', fg_color='#778899', values=["tool33", "tool66", "tool100", "inertia"], width=self.w_param, font=self.my_font)
|
||||||
widgits_at[widgit]['optionmenu'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col'], padx=5, pady=5, sticky='we')
|
widgits_at[widgit]['optionmenu'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col'], padx=5, pady=5, sticky='we')
|
||||||
widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text'])
|
widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text'])
|
||||||
widgits_at[widgit]['optionmenu'].configure(state='disabled')
|
widgits_at[widgit]['optionmenu'].configure(state='disabled')
|
||||||
@ -159,7 +161,7 @@ class App(customtkinter.CTk):
|
|||||||
self.myThread.start()
|
self.myThread.start()
|
||||||
|
|
||||||
def segmented_button_callback(self):
|
def segmented_button_callback(self):
|
||||||
_btn_funcs = {'get_state': '机器状态', 'warning_info': '告警信息', '3': '4', '5': '6', '7': '8'}
|
_btn_funcs = {'trigger_estop': '触发急停', 'reset_estop': '恢复急停', 'get_state': '机器状态', 'warning_info': '告警信息'}
|
||||||
value = self.seg_button.get()
|
value = self.seg_button.get()
|
||||||
|
|
||||||
self.seg_button.configure(state='disabled')
|
self.seg_button.configure(state='disabled')
|
||||||
@ -173,7 +175,7 @@ class App(customtkinter.CTk):
|
|||||||
else:
|
else:
|
||||||
for _func in _btn_funcs:
|
for _func in _btn_funcs:
|
||||||
if _btn_funcs[_func] == value:
|
if _btn_funcs[_func] == value:
|
||||||
btn_functions.main(self.hr, _func, self.write2textbox)
|
btn_functions.main(self.hr, self.md_at, _func, self.write2textbox)
|
||||||
break
|
break
|
||||||
|
|
||||||
self.seg_button.configure(state='normal')
|
self.seg_button.configure(state='normal')
|
||||||
@ -183,6 +185,8 @@ class App(customtkinter.CTk):
|
|||||||
with open(f"{current_path}/../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
with open(f"{current_path}/../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
||||||
f_hb.write('0')
|
f_hb.write('0')
|
||||||
self.hr = openapi.HmiRequest(self.write2textbox)
|
self.hr = openapi.HmiRequest(self.write2textbox)
|
||||||
|
self.md_at = openapi.ModbusRequest(self, 'Automatic Test')
|
||||||
|
self.md_dp = openapi.ModbusRequest(self, 'Data Process')
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
with open(f'{current_path}/../assets/templates/heartbeat', 'r', encoding='utf-8') as f_hb:
|
with open(f'{current_path}/../assets/templates/heartbeat', 'r', encoding='utf-8') as f_hb:
|
||||||
@ -192,7 +196,7 @@ class App(customtkinter.CTk):
|
|||||||
if c_state == '0':
|
if c_state == '0':
|
||||||
# self.textbox.delete(index1='1.0', index2='end')
|
# self.textbox.delete(index1='1.0', index2='end')
|
||||||
self.hr.t_bool = False
|
self.hr.t_bool = False
|
||||||
sleep(4)
|
sleep(3)
|
||||||
del self.hr
|
del self.hr
|
||||||
self.hr = openapi.HmiRequest(self.write2textbox)
|
self.hr = openapi.HmiRequest(self.write2textbox)
|
||||||
sleep(3)
|
sleep(3)
|
||||||
@ -284,7 +288,7 @@ class App(customtkinter.CTk):
|
|||||||
widgits_at[widgit]['entry'].configure(state='normal')
|
widgits_at[widgit]['entry'].configure(state='normal')
|
||||||
elif widgit in ['loadsel', ]:
|
elif widgit in ['loadsel', ]:
|
||||||
widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text'])
|
widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text'])
|
||||||
widgits_at[widgit]['optionmenu'].configure(text_color='black', state='disabled')
|
widgits_at[widgit]['optionmenu'].configure(state='normal', text_color='red')
|
||||||
else:
|
else:
|
||||||
self.initialization()
|
self.initialization()
|
||||||
self.menu_main_at.set("Start Here!")
|
self.menu_main_at.set("Start Here!")
|
||||||
@ -430,8 +434,11 @@ class App(customtkinter.CTk):
|
|||||||
return 0, 0
|
return 0, 0
|
||||||
elif func_name == 'current':
|
elif func_name == 'current':
|
||||||
path = widgits_at['path']['entry'].get().strip()
|
path = widgits_at['path']['entry'].get().strip()
|
||||||
if exists(path):
|
loadsel = widgits_at['loadsel']['optionmenu'].get()
|
||||||
return 6, path
|
c1 = exists(path)
|
||||||
|
c2 = loadsel in ['tool100', 'inertia']
|
||||||
|
if c1 and c2:
|
||||||
|
return 6, path, loadsel
|
||||||
else:
|
else:
|
||||||
return 0, 0
|
return 0, 0
|
||||||
else:
|
else:
|
||||||
@ -441,7 +448,7 @@ class App(customtkinter.CTk):
|
|||||||
self.textbox.delete(index1='1.0', index2='end')
|
self.textbox.delete(index1='1.0', index2='end')
|
||||||
|
|
||||||
flag, *args = self.check_param()
|
flag, *args = self.check_param()
|
||||||
func_dict = {1: brake.main, 2: current.main, 3: iso.main, 4: wavelogger.main, 5: do_brake.main}
|
func_dict = {1: brake.main, 2: current.main, 3: iso.main, 4: wavelogger.main, 5: do_brake.main, 6: do_current.main}
|
||||||
if flag == 1:
|
if flag == 1:
|
||||||
func_dict[flag](path=args[0], vel=args[1], trq=args[2], estop=args[3], w2t=self.write2textbox)
|
func_dict[flag](path=args[0], vel=args[1], trq=args[2], estop=args[3], w2t=self.write2textbox)
|
||||||
elif flag == 2:
|
elif flag == 2:
|
||||||
@ -451,10 +458,20 @@ class App(customtkinter.CTk):
|
|||||||
elif flag == 4:
|
elif flag == 4:
|
||||||
func_dict[flag](path=args[0], w2t=self.write2textbox)
|
func_dict[flag](path=args[0], w2t=self.write2textbox)
|
||||||
elif flag == 5:
|
elif flag == 5:
|
||||||
|
self.pre_warning()
|
||||||
func_dict[flag](path=args[0], hr=self.hr, loadsel=args[1], w2t=self.write2textbox)
|
func_dict[flag](path=args[0], hr=self.hr, loadsel=args[1], w2t=self.write2textbox)
|
||||||
|
elif flag == 6:
|
||||||
|
self.pre_warning()
|
||||||
|
func_dict[flag](path=args[0], hr=self.hr, md=self.md_at, loadsel=args[1], w2t=self.write2textbox)
|
||||||
else:
|
else:
|
||||||
tkinter.messagebox.showerror(title="参数错误", message="请检查对应参数是否填写正确!", )
|
tkinter.messagebox.showerror(title="参数错误", message="请检查对应参数是否填写正确!", )
|
||||||
|
|
||||||
|
def pre_warning(self):
|
||||||
|
if tkinter.messagebox.askyesno(title="开始运行", message="确认机器已按照测试规范更新固件,并提按照测试机型前修改好工程?"):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.write2textbox("请按照测试规范更新机器固件,并在实际运行前确认工程已经修改完毕,以防撞机!!!", 0, 123, 'red', 'Automatic Test')
|
||||||
|
|
||||||
def func_check_callback(self):
|
def func_check_callback(self):
|
||||||
self.textbox.delete(index1='1.0', index2='end')
|
self.textbox.delete(index1='1.0', index2='end')
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import json
|
from json import loads
|
||||||
from sys import argv
|
from sys import argv
|
||||||
|
|
||||||
|
|
||||||
@ -15,16 +15,26 @@ def validate_resp(_id, response, w2t):
|
|||||||
|
|
||||||
|
|
||||||
def execution(cmd, hr, w2t, **kwargs):
|
def execution(cmd, hr, w2t, **kwargs):
|
||||||
_id = hr.excution(cmd, **kwargs)
|
_id = hr.execution(cmd, **kwargs)
|
||||||
_msg = hr.get_from_id(_id)
|
_msg = hr.get_from_id(_id)
|
||||||
if not _msg:
|
if not _msg:
|
||||||
w2t(f"无法获取{_id}请求的响应信息", 0, 6, 'red', tab_name='Automatic Test')
|
w2t(f"无法获取{_id}请求的响应信息", 0, 6, 'red', tab_name='Automatic Test')
|
||||||
else:
|
else:
|
||||||
_response = json.loads(_msg)
|
_response = loads(_msg)
|
||||||
validate_resp(_id, _response, w2t)
|
validate_resp(_id, _response, w2t)
|
||||||
return _response
|
return _response
|
||||||
|
|
||||||
|
|
||||||
|
def trigger_estop(md, w2t):
|
||||||
|
md.trigger_estop()
|
||||||
|
w2t("触发急停成功,可点击机器状态验证。", 0, 0, 'green', 'Automatic Test')
|
||||||
|
|
||||||
|
|
||||||
|
def reset_estop(md, w2t):
|
||||||
|
md.reset_estop()
|
||||||
|
w2t("恢复急停成功,可点击机器状态验证。", 0, 0, 'green', 'Automatic Test')
|
||||||
|
|
||||||
|
|
||||||
def get_state(hr, w2t):
|
def get_state(hr, w2t):
|
||||||
# 获取机器状态
|
# 获取机器状态
|
||||||
_response = execution('state.get_state', hr, w2t)
|
_response = execution('state.get_state', hr, w2t)
|
||||||
@ -48,17 +58,21 @@ def get_state(hr, w2t):
|
|||||||
def warning_info(hr, w2t):
|
def warning_info(hr, w2t):
|
||||||
for msg in hr.c_msg:
|
for msg in hr.c_msg:
|
||||||
if 'alarm' in msg.lower():
|
if 'alarm' in msg.lower():
|
||||||
w2t(msg, tab_name='Automatic Test')
|
w2t(str(loads(msg)), tab_name='Automatic Test')
|
||||||
for msg in hr.c_msg_xs:
|
for msg in hr.c_msg_xs:
|
||||||
if 'alarm' in msg.lower():
|
if 'alarm' in msg.lower():
|
||||||
w2t(msg, tab_name='Automatic Test')
|
w2t(str(loads(msg)), tab_name='Automatic Test')
|
||||||
|
|
||||||
|
|
||||||
def main(hr, func, w2t):
|
def main(hr, md, func, w2t):
|
||||||
if hr is None:
|
if hr is None:
|
||||||
w2t("无法连接机器人,检查是否已经使用Robot Assist软件连接机器,重试中...", 0, 49, 'red', tab_name='Automatic Test')
|
w2t("无法连接机器人,检查是否已经使用Robot Assist软件连接机器,重试中...", 0, 49, 'red', tab_name='Automatic Test')
|
||||||
# func: get_state/
|
# func: get_state/
|
||||||
match func:
|
match func:
|
||||||
|
case 'trigger_estop':
|
||||||
|
trigger_estop(md, w2t)
|
||||||
|
case 'reset_estop':
|
||||||
|
reset_estop(md, w2t)
|
||||||
case 'get_state':
|
case 'get_state':
|
||||||
get_state(hr, w2t)
|
get_state(hr, w2t)
|
||||||
case 'warning_info':
|
case 'warning_info':
|
||||||
@ -68,21 +82,3 @@ def main(hr, func, w2t):
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main(*argv[1:])
|
main(*argv[1:])
|
||||||
|
|
||||||
|
|
||||||
# 一、设置/检测机器人状态:
|
|
||||||
# 1. 上电
|
|
||||||
# 2. 软限位打开
|
|
||||||
# 3. 示教器断开
|
|
||||||
# 4. 操作模式/机器人类型
|
|
||||||
# 5. 控制器状态/工作任务控件/机器人动态
|
|
||||||
|
|
||||||
# 二、加载RL程序开始运行
|
|
||||||
# 1. 怎么触发急停
|
|
||||||
# 2. 怎么恢复急停
|
|
||||||
# 3. 怎么采集曲线
|
|
||||||
# 4.
|
|
||||||
|
|
||||||
# 三、运行过程中,收集数据,并处理出结果
|
|
||||||
|
|
||||||
# 四
|
|
||||||
|
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
from time import sleep
|
import os
|
||||||
|
from time import sleep, time
|
||||||
from sys import argv
|
from sys import argv
|
||||||
from os import scandir
|
from os import scandir
|
||||||
from os.path import exists
|
from os.path import exists
|
||||||
from paramiko import SSHClient, AutoAddPolicy
|
from paramiko import SSHClient, AutoAddPolicy
|
||||||
from json import loads
|
from json import loads
|
||||||
|
import pandas
|
||||||
|
|
||||||
|
|
||||||
def traversal_files(path, w2t):
|
def traversal_files(path, w2t):
|
||||||
# 功能:以列表的形式分别返回指定路径下的文件和文件夹,不包含子目录
|
|
||||||
# 参数:路径
|
|
||||||
# 返回值:路径下的文件夹列表 路径下的文件列表
|
|
||||||
if not exists(path):
|
if not exists(path):
|
||||||
msg = f'数据文件夹{path}不存在,请确认后重试......'
|
msg = f'数据文件夹{path}不存在,请确认后重试......'
|
||||||
w2t(msg, 0, 1, 'red', tab_name='Automatic Test')
|
w2t(msg, 0, 1, 'red', tab_name='Automatic Test')
|
||||||
@ -25,34 +24,36 @@ def traversal_files(path, w2t):
|
|||||||
return dirs, files
|
return dirs, files
|
||||||
|
|
||||||
|
|
||||||
def check_files(data_dirs, data_files, w2t):
|
def check_files(path, data_dirs, data_files, w2t):
|
||||||
if len(data_dirs) != 0 or len(data_files) != 5:
|
if len(data_dirs) != 0 or len(data_files) != 3:
|
||||||
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下五个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下三个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
||||||
w2t(' 1. configs.xlsx\n 2. reach33/reach66/reach100_xxxx.xlsx\n 3. xxxx.zip', 0, 1, 'red', tab_name='Automatic Test')
|
w2t(' 1. configs.xlsx\n 2. T_电机电流.xlsx\n 3. xxxx.zip', 0, 1, 'red', tab_name='Automatic Test')
|
||||||
|
|
||||||
config_file = reach33 = reach66 = reach100 = prj_file = None
|
config_file = current_file = prj_file = None
|
||||||
for data_file in data_files:
|
for data_file in data_files:
|
||||||
filename = data_file.split('\\')[-1]
|
filename = data_file.split('\\')[-1]
|
||||||
if filename == 'configs.xlsx':
|
if filename == 'configs.xlsx':
|
||||||
config_file = data_file
|
config_file = data_file
|
||||||
elif filename.startswith('reach33_') and filename.endswith('.xlsx'):
|
elif filename == 'T_电机电流.xlsx':
|
||||||
reach33 = data_file
|
current_file = data_file
|
||||||
elif filename.startswith('reach66_') and filename.endswith('.xlsx'):
|
|
||||||
reach66 = data_file
|
|
||||||
elif filename.startswith('reach100_') and filename.endswith('.xlsx'):
|
|
||||||
reach100 = data_file
|
|
||||||
elif filename.endswith('.zip'):
|
elif filename.endswith('.zip'):
|
||||||
prj_file = data_file
|
prj_file = data_file
|
||||||
else:
|
else:
|
||||||
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下五个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下三个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
||||||
w2t(' 1. configs.xlsx\n 2. reach33/reach66/reach100_xxxx.xlsx\n 3. xxxx.zip', 0, 2, 'red', tab_name='Automatic Test')
|
w2t(' 1. configs.xlsx\n 2. T_电机电流.xlsx\n 3. xxxx.zip', 0, 1, 'red', tab_name='Automatic Test')
|
||||||
|
|
||||||
if config_file and reach33 and reach66 and reach100 and prj_file:
|
if config_file and current_file and prj_file:
|
||||||
w2t("数据目录合规性检查结束,未发现问题......", tab_name='Automatic Test')
|
w2t("数据目录合规性检查结束,未发现问题......", tab_name='Automatic Test')
|
||||||
return config_file, reach33, reach66, reach100, prj_file
|
os.mkdir(f"{path}\\single")
|
||||||
|
os.mkdir(f"{path}\\s_1")
|
||||||
|
os.mkdir(f"{path}\\s_2")
|
||||||
|
os.mkdir(f"{path}\\s_3")
|
||||||
|
os.mkdir(f"{path}\\inertia")
|
||||||
|
os.mkdir(f"{path}\\hold")
|
||||||
|
return config_file, current_file, prj_file
|
||||||
else:
|
else:
|
||||||
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下五个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
w2t('初始路径下不允许有文件夹,且初始路径下只能存在如下三个文件,确认后重新运行!', 0, 0, 'red', tab_name='Automatic Test')
|
||||||
w2t(' 1. configs.xlsx\n 2. reach33/reach66/reach100_xxxx.xlsx\n 3. xxxx.zip', 0, 1, 'red', tab_name='Automatic Test')
|
w2t(' 1. configs.xlsx\n 2. T_电机电流.xlsx\n 3. xxxx.zip', 0, 1, 'red', tab_name='Automatic Test')
|
||||||
|
|
||||||
|
|
||||||
def prj_to_xcore(prj_file):
|
def prj_to_xcore(prj_file):
|
||||||
@ -63,11 +64,8 @@ def prj_to_xcore(prj_file):
|
|||||||
# stdin, stdout, stderr = ssh.exec_command('rm /tmp/target.zip')
|
# stdin, stdout, stderr = ssh.exec_command('rm /tmp/target.zip')
|
||||||
# ssh.exec_command('rm /tmp/target.zip')
|
# ssh.exec_command('rm /tmp/target.zip')
|
||||||
sftp.put(prj_file, '/tmp/target.zip')
|
sftp.put(prj_file, '/tmp/target.zip')
|
||||||
cmd = 'cd /tmp; '
|
cmd = 'cd /tmp; rm -rf target/; mkdir target; unzip -d target/ -q target.zip; '
|
||||||
cmd += 'rm -rf target/; '
|
cmd += 'chmod 777 -R target/; rm target.zip'
|
||||||
cmd += 'mkdir target; '
|
|
||||||
cmd += 'unzip -d target/ -q target.zip; '
|
|
||||||
cmd += 'rm target.zip; '
|
|
||||||
ssh.exec_command(cmd)
|
ssh.exec_command(cmd)
|
||||||
|
|
||||||
cmd = 'sudo rm -rf /home/luoshi/bin/controller/projects/target; '
|
cmd = 'sudo rm -rf /home/luoshi/bin/controller/projects/target; '
|
||||||
@ -78,20 +76,17 @@ def prj_to_xcore(prj_file):
|
|||||||
print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo
|
print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo
|
||||||
print(stderr.read().decode()) # 顺便也执行以下stderr
|
print(stderr.read().decode()) # 顺便也执行以下stderr
|
||||||
|
|
||||||
cmd = 'cd /home/luoshi/bin/controller/; sudo mv projects/target/_build/*.prj projects/target/_build/target.prj '
|
_prj_name = prj_file.split('\\')[-1].removesuffix('.zip')
|
||||||
|
cmd = 'cd /home/luoshi/bin/controller/; '
|
||||||
|
cmd += f'sudo mv projects/target/_build/{_prj_name}.prj projects/target/_build/target.prj'
|
||||||
stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
|
stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
|
||||||
stdin.write('luoshi2019' + '\n')
|
stdin.write('luoshi2019' + '\n')
|
||||||
stdin.flush()
|
stdin.flush()
|
||||||
print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo
|
print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo
|
||||||
print(stderr.read().decode()) # 顺便也执行以下stderr
|
print(stderr.read().decode()) # 顺便也执行以下stderr
|
||||||
|
|
||||||
ssh.close()
|
ssh.close()
|
||||||
|
|
||||||
|
|
||||||
def modify_prj():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def validate_resp(_id, response, w2t):
|
def validate_resp(_id, response, w2t):
|
||||||
match _id:
|
match _id:
|
||||||
case 'DATA ERR':
|
case 'DATA ERR':
|
||||||
@ -105,70 +100,262 @@ def validate_resp(_id, response, w2t):
|
|||||||
|
|
||||||
|
|
||||||
def execution(cmd, hr, w2t, **kwargs):
|
def execution(cmd, hr, w2t, **kwargs):
|
||||||
_id = hr.excution(cmd, **kwargs)
|
_id = hr.execution(cmd, **kwargs)
|
||||||
_msg = hr.get_from_id(_id)
|
_msg = hr.get_from_id(_id)
|
||||||
if not _msg:
|
if not _msg:
|
||||||
w2t(f"无法获取{_id}请求的响应信息", 0, 6, 'red', tab_name='Automatic Test')
|
w2t(f"无法获取{_id}请求的响应信息", 0, 7, 'red', tab_name='Automatic Test')
|
||||||
else:
|
else:
|
||||||
_response = loads(_msg)
|
_response = loads(_msg)
|
||||||
validate_resp(_id, _response, w2t)
|
validate_resp(_id, _response, w2t)
|
||||||
return _response
|
return _response
|
||||||
|
|
||||||
|
|
||||||
def run_rl(hr, w2t):
|
def data_proc(path, filename, channel):
|
||||||
# prj_path = 'target/_build/target.prj'
|
if channel in list(range(6)):
|
||||||
# _response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['Durable_Test_Com', 'Mechanical_Test_Com'])
|
with open(filename, 'r', encoding='utf-8') as f_obj:
|
||||||
# print(f"reload prj: {_response}")
|
lines = f_obj.readlines()
|
||||||
# # _response = execution('overview.get_cur_prj', hr, w2t)
|
_d2d_vel = {'hw_joint_vel_feedback': []}
|
||||||
# # print(f"get cur prj name: {_response}")
|
_d2d_trq = {'device_servo_trq_feedback': []}
|
||||||
# _response = execution('rl_task.pp_to_main', hr, w2t, tasks=['Mechanical_Test_Com'])
|
for line in lines:
|
||||||
# print(f"set pp2main of prj: {_response}")
|
data = eval(line.strip())['data']
|
||||||
#
|
for item in data:
|
||||||
# _response = execution('state.switch_auto', hr, w2t)
|
if item.get('channel', None) == channel and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
# _response = execution('state.switch_motor_on', hr, w2t)
|
_d2d_vel['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
#
|
elif item.get('channel', None) == channel and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
# _response = execution('rl_task.run', hr, w2t, tasks=['Mechanical_Test_Com'])
|
_d2d_trq['device_servo_trq_feedback'].extend(item['value'])
|
||||||
# print(f"run prj: {_response}")
|
|
||||||
# sleep(10)
|
|
||||||
#
|
|
||||||
# _response = execution('state.switch_motor_off', hr, w2t)
|
|
||||||
# _response = execution('state.switch_manual', hr, w2t)
|
|
||||||
|
|
||||||
_response = execution('diagnosis.open', hr, w2t, open=True, display_open=True)
|
df1 = pandas.DataFrame.from_dict(_d2d_vel)
|
||||||
print(f"打开诊断: {_response}")
|
df2 = pandas.DataFrame.from_dict(_d2d_trq)
|
||||||
# _response = execution('diagnosis.get_params', hr, w2t)
|
df = pandas.concat([df1, df2], axis=1)
|
||||||
# print(f"显示诊断状态: {_response}")
|
_filename = f'{path}\\single\\j{channel+1}_single.data'
|
||||||
display_pdo_params = [
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
{"name": "device_servo_trq_feedback", "channel": 0}
|
elif channel in list(range(6, 9)):
|
||||||
|
with open(filename, 'r', encoding='utf-8') as f_obj:
|
||||||
|
lines = f_obj.readlines()
|
||||||
|
_d2d_vel_0 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_0 = {'device_servo_trq_feedback': []}
|
||||||
|
_d2d_vel_1 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_1 = {'device_servo_trq_feedback': []}
|
||||||
|
_d2d_vel_2 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_2 = {'device_servo_trq_feedback': []}
|
||||||
|
_d2d_vel_3 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_3 = {'device_servo_trq_feedback': []}
|
||||||
|
_d2d_vel_4 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_4 = {'device_servo_trq_feedback': []}
|
||||||
|
_d2d_vel_5 = {'hw_joint_vel_feedback': []}
|
||||||
|
_d2d_trq_5 = {'device_servo_trq_feedback': []}
|
||||||
|
for line in lines:
|
||||||
|
data = eval(line.strip())['data']
|
||||||
|
for item in data:
|
||||||
|
if item.get('channel', None) == 0 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_0['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 0 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_0['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 1 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_1['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 1 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_1['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 2 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_2['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 2 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_2['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 3 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_3['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 3 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_3['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 4 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_4['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 4 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_4['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 5 and item.get('name', None) == 'hw_joint_vel_feedback':
|
||||||
|
_d2d_vel_5['hw_joint_vel_feedback'].extend(item['value'])
|
||||||
|
elif item.get('channel', None) == 5 and item.get('name', None) == 'device_servo_trq_feedback':
|
||||||
|
_d2d_trq_5['device_servo_trq_feedback'].extend(item['value'])
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_0)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_0)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j1_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_1)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_1)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j2_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_2)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_2)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j3_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_3)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_3)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j4_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_4)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_4)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j5_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
df_01 = pandas.DataFrame.from_dict(_d2d_vel_5)
|
||||||
|
df_02 = pandas.DataFrame.from_dict(_d2d_trq_5)
|
||||||
|
df = pandas.concat([df_01, df_02], axis=1)
|
||||||
|
_filename = f'{path}\\s_{channel-5}\\j6_s_1.data'
|
||||||
|
df.to_csv(_filename, sep='\t', index=False)
|
||||||
|
|
||||||
|
|
||||||
|
def gen_result_file(path, loadsel, disc, number):
|
||||||
|
filename = path + f'\\data.txt'
|
||||||
|
with open(filename, 'w', encoding='utf-8') as f_obj:
|
||||||
|
for line in disc[number][1]:
|
||||||
|
f_obj.write(str(line)+'\n')
|
||||||
|
|
||||||
|
if loadsel == 'tool100':
|
||||||
|
data_proc(path, filename, number)
|
||||||
|
elif loadsel == 'inertia':
|
||||||
|
data_proc(path, filename, 'all')
|
||||||
|
|
||||||
|
|
||||||
|
def regular_load(path, hr, md, loadsel, w2t):
|
||||||
|
conditions = [
|
||||||
|
" scenario(0, j1_p, j1_n, p_speed, p_tool)",
|
||||||
|
" scenario(0, j2_p, j2_n, p_speed, p_tool)",
|
||||||
|
" scenario(0, j3_p, j3_n, p_speed, p_tool)",
|
||||||
|
" scenario(0, j4_p, j4_n, p_speed, p_tool)",
|
||||||
|
" scenario(0, j5_p, j5_n, p_speed, p_tool)",
|
||||||
|
" scenario(0, j6_p, j6_n, p_speed, p_tool)",
|
||||||
|
" scenario(1, j5_p, j5_n, p_speed, p_tool)",
|
||||||
|
" scenario(2, j5_p, j5_n, p_speed, p_tool)",
|
||||||
|
" scenario(3, j5_p, j5_n, p_speed, p_tool)",
|
||||||
]
|
]
|
||||||
_response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params)
|
for condition in conditions:
|
||||||
print(f"执行采样: {_response}")
|
disc = {
|
||||||
sleep(5)
|
0: ['一轴', []], 1: ['二轴', []], 2: ['三轴', []], 3: ['四轴', []], 4: ['五轴', []], 5: ['六轴', []],
|
||||||
|
6: ['场景一', []], 7: ['场景二', []], 8: ['场景三', []]
|
||||||
|
}
|
||||||
|
number = conditions.index(condition)
|
||||||
|
w2t(f"正在执行{disc[number][0]}测试......", 0, 0, 'purple', 'Automatic Test')
|
||||||
|
|
||||||
_response = execution('diagnosis.open', hr, w2t, open=False, display_open=False)
|
# 1. 关闭诊断曲线,触发软急停,并解除,目的是让可能正在运行着的机器停下来,切手动模式并下电
|
||||||
print(f"关闭诊断: {_response}")
|
_response = execution('diagnosis.open', hr, w2t, open=False, display_open=False)
|
||||||
# sleep(1)
|
md.trigger_estop()
|
||||||
for _msg in hr.c_msg:
|
md.reset_estop()
|
||||||
if 'diagnosis.result' in _msg:
|
_response = execution('state.switch_manual', hr, w2t)
|
||||||
print(_msg)
|
_response = execution('state.switch_motor_off', hr, w2t)
|
||||||
# _msg = json.loads(_msg)
|
|
||||||
# if 'channel' in _msg and 'name' in _msg:
|
|
||||||
# if int(_msg['channel']) == 0 and _msg['name'] == 'device_servo_trq_feedback':
|
|
||||||
# print(f"diagnosis.result: {_msg}")
|
|
||||||
# count += 1
|
|
||||||
# if count * 50 > 5 * 1000:
|
|
||||||
# break
|
|
||||||
|
|
||||||
|
# 2. 修改未要执行的场景
|
||||||
|
ssh = SSHClient()
|
||||||
|
ssh.set_missing_host_key_policy(AutoAddPolicy())
|
||||||
|
ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019')
|
||||||
|
cmd = 'cd /home/luoshi/bin/controller/; '
|
||||||
|
cmd += 'sudo sed -i "/scenario/d" projects/target/_build/current/main.mod; '
|
||||||
|
cmd += f'sudo sed -i "/DONOTDELETE/i {condition}" projects/target/_build/current/main.mod'
|
||||||
|
stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
|
||||||
|
stdin.write('luoshi2019' + '\n')
|
||||||
|
stdin.flush()
|
||||||
|
print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo
|
||||||
|
print(stderr.read().decode()) # 顺便也执行以下stderr
|
||||||
|
|
||||||
|
# 3. reload工程后,pp2main,并且自动模式和上电
|
||||||
|
prj_path = 'target/_build/target.prj'
|
||||||
|
_response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['current'])
|
||||||
|
_response = execution('overview.get_cur_prj', hr, w2t)
|
||||||
|
_response = execution('rl_task.pp_to_main', hr, w2t, tasks=['current'])
|
||||||
|
_response = execution('state.switch_auto', hr, w2t)
|
||||||
|
_response = execution('state.switch_motor_on', hr, w2t)
|
||||||
|
|
||||||
|
# 4. 开始运行程序,单轴运行15s
|
||||||
|
_response = execution('rl_task.run', hr, w2t, tasks=['current'])
|
||||||
|
for i in range(3):
|
||||||
|
if md.read_ready_to_go() == 1:
|
||||||
|
md.write_act(True)
|
||||||
|
sleep(1)
|
||||||
|
md.write_act(False)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
sleep(1)
|
||||||
|
else:
|
||||||
|
w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test')
|
||||||
|
|
||||||
|
# 5. 打开诊断曲线,并执行采集
|
||||||
|
_response = execution('diagnosis.open', hr, w2t, open=True, display_open=True)
|
||||||
|
display_pdo_params = [
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 0},
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 1},
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 2},
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 3},
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 4},
|
||||||
|
{"name": "hw_joint_vel_feedback", "channel": 5},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 0},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 1},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 2},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 3},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 4},
|
||||||
|
{"name": "device_servo_trq_feedback", "channel": 5},
|
||||||
|
{"name": "device_safety_estop", "channel": 0},
|
||||||
|
]
|
||||||
|
_response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params)
|
||||||
|
if number < 6:
|
||||||
|
sleep(15)
|
||||||
|
else:
|
||||||
|
_t_start = time()
|
||||||
|
while True:
|
||||||
|
scenario_time = md.read_scenario_time()
|
||||||
|
if float(scenario_time) > 1:
|
||||||
|
w2t(f"场景{number-5}的周期时间:{scenario_time}", 0, 0, 'green', 'Automatic Test')
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
if (time()-_t_start)//60 > 3:
|
||||||
|
w2t(f"未收到场景{number-5}的周期时间,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test')
|
||||||
|
else:
|
||||||
|
sleep(5)
|
||||||
|
sleep(1) # 一定要延迟一秒再读一次scenario time寄存器,因为一开始读取的数值不准确
|
||||||
|
sleep(float(md.read_scenario_time())*0.2) # 再运行周期的20%即可
|
||||||
|
|
||||||
|
# 6. 关闭诊断曲线,停止程序运行,下电并且换成手动模式
|
||||||
|
_response = execution('diagnosis.open', hr, w2t, open=False, display_open=False)
|
||||||
|
_response = execution('rl_task.stop', hr, w2t, tasks=['current'])
|
||||||
|
_response = execution('state.switch_motor_off', hr, w2t)
|
||||||
|
_response = execution('state.switch_manual', hr, w2t)
|
||||||
|
sleep(2) # 保证所有数据均已返回
|
||||||
|
# 7. 保留数据并处理输出
|
||||||
|
for _msg in hr.c_msg:
|
||||||
|
if 'diagnosis.result' in _msg:
|
||||||
|
disc[number][1].insert(0, loads(_msg))
|
||||||
|
else:
|
||||||
|
_index = 210
|
||||||
|
for _msg in hr.c_msg:
|
||||||
|
if 'diagnosis.result' in _msg:
|
||||||
|
_index = hr.c_msg.index(_msg)
|
||||||
|
break
|
||||||
|
del hr.c_msg[_index-10:]
|
||||||
|
hr.c_msg_xs.clear()
|
||||||
|
gen_result_file(path, loadsel, disc, number)
|
||||||
else:
|
else:
|
||||||
sleep(1)
|
w2t("满载情况下,单轴和场景电机电流采集完毕。", 0, 0, 'green', 'Automatic Test')
|
||||||
|
|
||||||
|
|
||||||
def main(path, hr, loadsel, w2t):
|
def inertia_load(path, hr, md, loadsel, w2t):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def run_rl(path, hr, md, loadsel, w2t):
|
||||||
|
if loadsel == 'tool100':
|
||||||
|
regular_load(path, hr, md, loadsel, w2t)
|
||||||
|
elif loadsel == 'inertia':
|
||||||
|
inertia_load(path, hr, md, loadsel, w2t)
|
||||||
|
|
||||||
|
|
||||||
|
def main(path, hr, md, loadsel, w2t):
|
||||||
data_dirs, data_files = traversal_files(path, w2t)
|
data_dirs, data_files = traversal_files(path, w2t)
|
||||||
config_file, reach33, reach66, reach100, prj_file = check_files(data_dirs, data_files, w2t)
|
config_file, current_file, prj_file = check_files(path, data_dirs, data_files, w2t)
|
||||||
# prj_to_xcore(prj_file)
|
prj_to_xcore(prj_file)
|
||||||
run_rl(hr, w2t)
|
run_rl(path, hr, md, loadsel, w2t)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -1,15 +1,130 @@
|
|||||||
from json import load, dumps
|
from json import load, dumps, loads
|
||||||
from socket import socket, setdefaulttimeout, AF_INET, SOCK_STREAM
|
from socket import socket, setdefaulttimeout, AF_INET, SOCK_STREAM
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
import selectors
|
import selectors
|
||||||
from time import time, sleep
|
from time import time, sleep
|
||||||
from os.path import dirname
|
from os.path import dirname
|
||||||
|
from pymodbus.client.tcp import ModbusTcpClient
|
||||||
|
from pymodbus.payload import BinaryPayloadDecoder
|
||||||
|
from pymodbus.constants import Endian
|
||||||
|
|
||||||
MAX_FRAME_SIZE = 1024
|
MAX_FRAME_SIZE = 1024
|
||||||
setdefaulttimeout(2)
|
setdefaulttimeout(2)
|
||||||
current_path = dirname(__file__)
|
current_path = dirname(__file__)
|
||||||
|
|
||||||
|
|
||||||
|
class ModbusRequest(object):
|
||||||
|
def __init__(self, w2t, tab_name):
|
||||||
|
super().__init__()
|
||||||
|
self.w2t = w2t
|
||||||
|
self.tab_name = tab_name
|
||||||
|
self.host = '192.168.0.160'
|
||||||
|
self.port = 502
|
||||||
|
self.c = ModbusTcpClient(self.host, self.port)
|
||||||
|
self.c.connect()
|
||||||
|
|
||||||
|
def motor_off(self):
|
||||||
|
try:
|
||||||
|
self.c.write_register(40002, 1)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法正常下电,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def motor_on(self):
|
||||||
|
try:
|
||||||
|
self.c.write_register(40003, 1)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法正常上电,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def trigger_estop(self):
|
||||||
|
try:
|
||||||
|
self.c.write_register(40012, 0)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法触发软急停,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def reset_estop(self):
|
||||||
|
try:
|
||||||
|
self.c.write_register(40012, 1)
|
||||||
|
# self.c.write_register(40001, 1)
|
||||||
|
# sleep(0.2)
|
||||||
|
# self.c.write_register(40001, 1)
|
||||||
|
# sleep(0.2)
|
||||||
|
# self.c.write_register(40001, 0)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法重置软急停,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def clear_alarm(self):
|
||||||
|
try:
|
||||||
|
self.c.write_register(40000, 1)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法清除告警,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def get_cart_vel(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(40537, 7)
|
||||||
|
print(f"cart vel: {results.registers}")
|
||||||
|
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取笛卡尔速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def get_jnt_vel(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(40579, 7)
|
||||||
|
print(f"joint vel: {results.registers}")
|
||||||
|
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取关节速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def get_tcp_vel(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(40607, 7)
|
||||||
|
print(f"tcp vel: {results.registers}")
|
||||||
|
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取TCP速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def get_tcp_mag_vel(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(40621, 1)
|
||||||
|
print(f"tcp mag: {results.registers}")
|
||||||
|
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取TCP合成速度,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def write_act(self, number):
|
||||||
|
try:
|
||||||
|
self.c.write_register(41000, number)
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法发送执行信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def read_ready_to_go(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(41001, 1)
|
||||||
|
return results.registers[0]
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取准备信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
def read_scenario_time(self):
|
||||||
|
try:
|
||||||
|
results = self.c.read_holding_registers(41002, 2)
|
||||||
|
result = BinaryPayloadDecoder.fromRegisters(results.registers, byteorder=Endian.BIG, wordorder=Endian.LITTLE)
|
||||||
|
result = f"{result.decode_32bit_float():.3f}"
|
||||||
|
return result
|
||||||
|
except Exception as Err:
|
||||||
|
self.w2t(f"{Err}")
|
||||||
|
self.w2t("无法读取准备信号,连接Modbus失败,需要确认网络是否通畅,或是未正确导入寄存器文件...", 0, 100, 'red', self.tab_name)
|
||||||
|
|
||||||
|
|
||||||
class HmiRequest(object):
|
class HmiRequest(object):
|
||||||
def __init__(self, w2t):
|
def __init__(self, w2t):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@ -25,15 +140,21 @@ class HmiRequest(object):
|
|||||||
self.response_xs = ''
|
self.response_xs = ''
|
||||||
self.t_bool = True
|
self.t_bool = True
|
||||||
self.tab_name = 'Automatic Test'
|
self.tab_name = 'Automatic Test'
|
||||||
|
self.pkg_size = 0
|
||||||
|
self.broke = 0
|
||||||
|
self.half = 0
|
||||||
|
self.half_length = 0
|
||||||
|
self.index = 0
|
||||||
|
self.reset_index = 0
|
||||||
|
|
||||||
self.sock_conn()
|
self.sock_conn()
|
||||||
self.t_heartbeat = Thread(target=self.heartbeat)
|
self.t_heartbeat = Thread(target=self.heartbeat)
|
||||||
self.t_heartbeat.daemon = True
|
self.t_heartbeat.daemon = True
|
||||||
self.t_heartbeat.start()
|
self.t_heartbeat.start()
|
||||||
self.t_unpackage = Thread(target=self.unpackage, args=(self.c, ))
|
self.t_unpackage = Thread(target=self.unpackage, args=(self.c,))
|
||||||
self.t_unpackage.daemon = True
|
self.t_unpackage.daemon = True
|
||||||
self.t_unpackage.start()
|
self.t_unpackage.start()
|
||||||
self.t_unpackage_xs = Thread(target=self.unpackage_xs, args=(self.c_xs, ))
|
self.t_unpackage_xs = Thread(target=self.unpackage_xs, args=(self.c_xs,))
|
||||||
self.t_unpackage_xs.daemon = True
|
self.t_unpackage_xs.daemon = True
|
||||||
self.t_unpackage_xs.start()
|
self.t_unpackage_xs.start()
|
||||||
|
|
||||||
@ -55,43 +176,58 @@ class HmiRequest(object):
|
|||||||
self.w2t("Connection success", 0, 0, 'green', tab_name=self.tab_name)
|
self.w2t("Connection success", 0, 0, 'green', tab_name=self.tab_name)
|
||||||
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
||||||
f_hb.write('1')
|
f_hb.write('1')
|
||||||
|
md = ModbusRequest(self.w2t, self.tab_name)
|
||||||
|
md.reset_estop()
|
||||||
|
md.clear_alarm()
|
||||||
|
md.write_act(False)
|
||||||
except Exception as Err:
|
except Exception as Err:
|
||||||
self.w2t("Connection failed...", 0, 0, 'red', tab_name=self.tab_name)
|
self.w2t("Connection failed...", 0, 0, 'red', tab_name=self.tab_name)
|
||||||
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
||||||
f_hb.write('0')
|
f_hb.write('0')
|
||||||
|
|
||||||
def header_check(self, index, data):
|
def header_check(self, index, data):
|
||||||
try:
|
if index + 8 < len(data):
|
||||||
_frame_size = int.from_bytes(data[index:index+2], byteorder='big')
|
_frame_size = int.from_bytes(data[index:index+2], byteorder='big')
|
||||||
_pkg_size = int.from_bytes(data[index+2:index+6], byteorder='big')
|
_pkg_size = int.from_bytes(data[index+2:index+6], byteorder='big')
|
||||||
_protocol = int.from_bytes(data[index+6:index+7], byteorder='big')
|
_protocol = int.from_bytes(data[index + 6:index + 7], byteorder='big')
|
||||||
_reserved = int.from_bytes(data[index+7:index+8], byteorder='big')
|
_reserved = int.from_bytes(data[index + 7:index + 8], byteorder='big')
|
||||||
|
|
||||||
if _reserved == 0 and _protocol == 2:
|
if _reserved == 0 and _protocol == 2:
|
||||||
return index+8, _frame_size, _pkg_size
|
return index + 8, _frame_size, _pkg_size
|
||||||
else:
|
else:
|
||||||
print("数据有误,需要确认")
|
print(data)
|
||||||
return 'DATA ERR'
|
# print(f"index = {index}")
|
||||||
except Exception as Err:
|
# print(f"reserve = {_reserved}")
|
||||||
print(f"Err = {Err}")
|
# print(f"protocol = {_protocol}")
|
||||||
print("无法读取数据,需要确认")
|
# print("head check 数据有误,需要确认")
|
||||||
return 'DATA READ ERR'
|
self.w2t("Header Check: 解包数据有误,需要确认!", 0, 1, 'red', tab_name=self.tab_name)
|
||||||
|
else:
|
||||||
|
self.half_length = len(data) - index
|
||||||
|
self.half = data[index:]
|
||||||
|
|
||||||
|
# print(f"in head check half: {self.half}")
|
||||||
|
# print(f"in head check length: {self.half_length}")
|
||||||
|
# print(f"in head check data: {data}")
|
||||||
|
|
||||||
|
self.broke = 100
|
||||||
|
index += MAX_FRAME_SIZE
|
||||||
|
return index, 0, 0
|
||||||
|
|
||||||
def heartbeat(self):
|
def heartbeat(self):
|
||||||
while self.t_bool:
|
while self.t_bool:
|
||||||
_id = self.excution('controller.heart')
|
_id = self.execution('controller.heart')
|
||||||
_flag = '0' if self.get_from_id(_id) is None else '1'
|
_flag = '0' if self.get_from_id(_id) is None else '1'
|
||||||
print(f"hb = {_flag}", end=' ')
|
print(f"hb = {_flag}", end=' ')
|
||||||
|
print(f"len(c_msg) = {len(self.c_msg)}", end=' ')
|
||||||
|
print(f"len(c_msg_xs) = {len(self.c_msg_xs)}", end='\n')
|
||||||
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
with open(f"{current_path}/../../assets/templates/heartbeat", "w", encoding='utf-8') as f_hb:
|
||||||
f_hb.write(_flag)
|
f_hb.write(_flag)
|
||||||
if _flag == '0':
|
if _flag == '0':
|
||||||
self.w2t(f"心跳丢失,连接失败,重新连接中...", 0, 0, 'red', tab_name=self.tab_name)
|
self.w2t(f"{_id} 心跳丢失,连接失败,重新连接中...", 0, 7, 'red', tab_name=self.tab_name)
|
||||||
sleep(2)
|
sleep(2)
|
||||||
print(len(self.c_msg), end=' ')
|
|
||||||
# with open(f"{current_path}/../../assets/templates/c_msg.log", "w", encoding='utf-8') as f:
|
# with open(f"{current_path}/../../assets/templates/c_msg.log", "w", encoding='utf-8') as f:
|
||||||
# for msg in self.c_msg:
|
# for msg in self.c_msg:
|
||||||
# f.write(msg + '\n')
|
# f.write(str(loads(msg)) + '\n')
|
||||||
|
|
||||||
def msg_storage(self, response, flag=0):
|
def msg_storage(self, response, flag=0):
|
||||||
messages = self.c_msg if flag == 0 else self.c_msg_xs
|
messages = self.c_msg if flag == 0 else self.c_msg_xs
|
||||||
@ -103,55 +239,199 @@ class HmiRequest(object):
|
|||||||
messages.pop()
|
messages.pop()
|
||||||
|
|
||||||
def get_response(self, data):
|
def get_response(self, data):
|
||||||
_index = 0
|
# 流式获取单次请求的响应
|
||||||
while _index < len(data):
|
if self.broke == 100:
|
||||||
|
# print("*****************************************")
|
||||||
|
# print(f"in get_response if broke == 100 half = {self.half}")
|
||||||
|
_half_1 = self.half
|
||||||
|
_half_2 = data[:8-self.half_length]
|
||||||
|
_full = _half_1 + _half_2
|
||||||
|
# print(f"in get_response if broke == 100 _full = {_full}")
|
||||||
|
|
||||||
|
_frame_size = int.from_bytes(_full[:2], byteorder='big')
|
||||||
|
_pkg_size = int.from_bytes(_full[2:6], byteorder='big')
|
||||||
|
_protocol = int.from_bytes(_full[6:7], byteorder='big')
|
||||||
|
_reserved = int.from_bytes(_full[7:8], byteorder='big')
|
||||||
|
if _reserved != 0 or _protocol != 2:
|
||||||
|
print(data)
|
||||||
|
self.w2t("in get_response: 解包数据有误,需要确认!", 0, 1, 'red', tab_name=self.tab_name)
|
||||||
|
|
||||||
|
self.pkg_size = _pkg_size
|
||||||
|
self.index = 8 - self.half_length
|
||||||
|
# print(f"broke == 100 index = {self.index}")
|
||||||
|
# print(f"broke == 100 INIT pkg size = {self.pkg_size}")
|
||||||
|
# print(f"broke == 100 data = {data}")
|
||||||
|
else:
|
||||||
|
if self.reset_index == 1:
|
||||||
|
self.index = 0
|
||||||
|
|
||||||
|
while self.index < len(data):
|
||||||
|
# flag 为 0,则说明是一次新的请求对应的一次新的相应,也就是需要首次解包
|
||||||
if self.flag == 0:
|
if self.flag == 0:
|
||||||
_index, _frame_size, _pkg_size = self.header_check(_index, data)
|
if self.broke == 100:
|
||||||
if _pkg_size <= len(data) - _index:
|
self.broke = 0
|
||||||
# 说明剩余部分的数据正好就是完整的包数据
|
|
||||||
self.response = data[_index:_index+_pkg_size].decode()
|
|
||||||
self.msg_storage(flag=0, response=self.response)
|
|
||||||
_index += _pkg_size
|
|
||||||
self.flag = 0
|
|
||||||
self.response = ''
|
|
||||||
self.leftover = 0
|
|
||||||
elif _pkg_size > len(data) - _index:
|
|
||||||
# 说有有分包的情况发生了,需要flag=1的处理
|
|
||||||
self.flag = 1
|
|
||||||
self.response = data[_index:].decode()
|
|
||||||
self.leftover = _frame_size - 6 - (len(data) - _index) # 其实就是常量 2,其中 6 就是六个字节的包头
|
|
||||||
break
|
|
||||||
|
|
||||||
elif self.flag == 1:
|
|
||||||
# 处理完之后,将flag重置为0
|
|
||||||
_index = self.leftover
|
|
||||||
self.response += data[:_index].decode()
|
|
||||||
_index += 2
|
|
||||||
|
|
||||||
_frame_size = int.from_bytes(data[_index - 2:_index], byteorder='big')
|
|
||||||
if _frame_size == 0:
|
|
||||||
self.msg_storage(flag=0, response=self.response)
|
|
||||||
self.flag = 0
|
|
||||||
self.response = ''
|
|
||||||
self.leftover = 0
|
|
||||||
break
|
|
||||||
|
|
||||||
if _frame_size == MAX_FRAME_SIZE:
|
|
||||||
self.leftover = MAX_FRAME_SIZE - (len(data) - _index)
|
|
||||||
self.response += data[_index:].decode()
|
|
||||||
break
|
|
||||||
else:
|
else:
|
||||||
if _index+_frame_size <= MAX_FRAME_SIZE:
|
self.index, _frame_size, self.pkg_size = self.header_check(self.index, data)
|
||||||
self.response += data[_index:_index+_frame_size].decode()
|
# print(f"broke == 0 index = {self.index-8}")
|
||||||
self.msg_storage(flag=0, response=self.response)
|
# print(f"broke == 0 INIT pkg size = {self.pkg_size}")
|
||||||
self.flag = 0
|
# print(f"broke == 0 data = {data}")
|
||||||
self.response = ''
|
if self.index > MAX_FRAME_SIZE:
|
||||||
self.leftover = 0
|
|
||||||
break
|
break
|
||||||
|
# 详见解包原理数据.txt,self.pkg_size 永远是除了当前data之外剩余未处理的数据大小
|
||||||
|
if self.pkg_size <= len(data) - self.index:
|
||||||
|
# 说明剩余部分的数据就在当前data内,没有被分割
|
||||||
|
self.response = data[self.index:self.index + self.pkg_size].decode()
|
||||||
|
self.msg_storage(flag=0, response=self.response)
|
||||||
|
self.index += self.pkg_size
|
||||||
|
# print(f"in flag=0 if data = {data}")
|
||||||
|
# print(f"in flag=0 if index = {self.index}")
|
||||||
|
# print(f"in flag=0 if pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in flag=0 if leftover = {self.leftover}")
|
||||||
|
self.flag = 0
|
||||||
|
self.response = ''
|
||||||
|
self.leftover = 0
|
||||||
|
self.pkg_size = 0
|
||||||
|
self.reset_index = 0 if self.index < len(data) else 1
|
||||||
|
elif self.pkg_size > len(data) - self.index:
|
||||||
|
# 执行到这里说明该data是首包,且有有分包的情况发生了也就是该响应数据量稍微比较大
|
||||||
|
# 分散在了相邻的两个及以上的data中,需要flag=1的处理
|
||||||
|
self.flag = 1
|
||||||
|
if self.index+_frame_size-6 <= len(data):
|
||||||
|
self.response = data[self.index:self.index+_frame_size-6].decode()
|
||||||
|
self.index += (_frame_size-6)
|
||||||
|
self.pkg_size -= (_frame_size-6) # 详见解包原理数据.txt,self.pkg_size
|
||||||
|
self.reset_index = 0
|
||||||
|
|
||||||
|
if self.index + 2 < len(data):
|
||||||
|
self.leftover = int.from_bytes(data[self.index:self.index + 2], byteorder='big')
|
||||||
|
self.index += 2
|
||||||
|
self.reset_index = 0
|
||||||
|
else:
|
||||||
|
if self.index + 2 == len(data):
|
||||||
|
self.broke = 1
|
||||||
|
self.half = data[-2:]
|
||||||
|
# print(f"flag = 0 encounter broke == 1 - half = {self.half}")
|
||||||
|
elif self.index + 1 == len(data):
|
||||||
|
self.broke = 2
|
||||||
|
self.half = data[-1:]
|
||||||
|
# print(f"flag = 0 encounter broke == 2 - half = {self.half}")
|
||||||
|
elif self.index == len(data):
|
||||||
|
# print('flag = 0 encounter broke == 3')
|
||||||
|
self.broke = 3
|
||||||
|
|
||||||
|
self.index += MAX_FRAME_SIZE
|
||||||
|
self.reset_index = 1
|
||||||
|
break # 因为 index + 2 的大小超过 MAX_FRAME_SIZE
|
||||||
|
|
||||||
|
elif self.index+_frame_size-6 > len(data):
|
||||||
|
self.response = data[self.index:].decode()
|
||||||
|
self.pkg_size -= (len(data) - self.index) # 详见解包原理数据.txt,self.pkg_size
|
||||||
|
self.leftover = (_frame_size-6-(len(data)-self.index))
|
||||||
|
self.index += MAX_FRAME_SIZE
|
||||||
|
self.reset_index = 1
|
||||||
|
|
||||||
|
# print(f"in flag=0 else data = {data}")
|
||||||
|
# print(f"in flag=0 else index = {self.index}")
|
||||||
|
# print(f"in flag=0 else pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in flag=0 else leftover = {self.leftover}")
|
||||||
|
# break
|
||||||
|
elif self.flag == 1:
|
||||||
|
# 继续处理之前为接收完的数据,处理完之后将flag重置为0
|
||||||
|
# !!!需要注意的是,包头/帧头也是有可能被分割开的!!!但是目前该程序未实现此种情况!!!
|
||||||
|
if self.broke == 1:
|
||||||
|
self.index = 0
|
||||||
|
self.leftover = int.from_bytes(self.half, byteorder='big')
|
||||||
|
self.broke = 0
|
||||||
|
# print(f"broke 1 leftover: {self.leftover}")
|
||||||
|
elif self.broke == 2:
|
||||||
|
self.leftover = int.from_bytes(self.half+data[:1], byteorder='big')
|
||||||
|
self.index = 1
|
||||||
|
self.broke = 0
|
||||||
|
# print(f"broke 2 leftover: {self.leftover}")
|
||||||
|
if self.broke == 3:
|
||||||
|
self.leftover = int.from_bytes(data[:2], byteorder='big')
|
||||||
|
# print(f"broke 3 leftover: {self.leftover}")
|
||||||
|
self.index = 2
|
||||||
|
self.broke = 0
|
||||||
|
while self.pkg_size > 0:
|
||||||
|
if self.index + self.leftover <= len(data):
|
||||||
|
# print(f"in pkg size > 0 loop before if data = {data}")
|
||||||
|
# print(f"in pkg size > 0 loop before if index = {self.index}")
|
||||||
|
# print(f"in pkg size > 0 loop before if pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in pkg size > 0 loop before if leftover = {self.leftover}")
|
||||||
|
if self.leftover < 0 or self.leftover > 1024:
|
||||||
|
self.w2t("", 0, 111, 'red')
|
||||||
|
self.response += data[self.index:self.index + self.leftover].decode()
|
||||||
|
self.pkg_size -= self.leftover
|
||||||
|
if self.pkg_size == 0:
|
||||||
|
self.msg_storage(flag=0, response=self.response)
|
||||||
|
self.index += self.leftover
|
||||||
|
self.flag = 0
|
||||||
|
self.response = ''
|
||||||
|
self.leftover = 0
|
||||||
|
self.pkg_size = 0
|
||||||
|
self.reset_index = 0 if self.index < len(data) else 1
|
||||||
|
# print(f"in pkg size > 0 loop break if data = {data}")
|
||||||
|
# print(f"in pkg size > 0 loop break if index = {self.index}")
|
||||||
|
# print(f"in pkg size > 0 loop break if pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in pkg size > 0 loop break if leftover = {self.leftover}")
|
||||||
|
break
|
||||||
|
|
||||||
|
self.index += self.leftover
|
||||||
|
if self.index + 2 < len(data):
|
||||||
|
self.leftover = int.from_bytes(data[self.index:self.index + 2], byteorder='big')
|
||||||
|
self.index += 2
|
||||||
|
self.reset_index = 0
|
||||||
|
else:
|
||||||
|
# self.leftover = 4096
|
||||||
|
if self.index + 2 == len(data):
|
||||||
|
self.broke = 1
|
||||||
|
self.half = data[-2:]
|
||||||
|
# print(f"flag = 1 encounter broke == 1 - half = {self.half}")
|
||||||
|
elif self.index + 1 == len(data):
|
||||||
|
self.broke = 2
|
||||||
|
self.half = data[-1:]
|
||||||
|
# print(f"flag = 1 encounter broke == 2 - half = {self.half}")
|
||||||
|
elif self.index == len(data):
|
||||||
|
# print('flag = 1 encounter broke == 3')
|
||||||
|
self.broke = 3
|
||||||
|
|
||||||
|
self.index += MAX_FRAME_SIZE
|
||||||
|
self.reset_index = 1
|
||||||
|
break # 因为 index + 2 的大小超过 MAX_FRAME_SIZE
|
||||||
|
# print(f"in pkg size > 0 loop after if data = {data}")
|
||||||
|
# print(f"in pkg size > 0 loop after if index = {self.index}")
|
||||||
|
# print(f"in pkg size > 0 loop after if pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in pkg size > 0 loop after if leftover = {self.leftover}")
|
||||||
|
if self.leftover < 0 or self.leftover > 1024:
|
||||||
|
self.w2t("", 0, 111, 'red')
|
||||||
else:
|
else:
|
||||||
self.response += data[_index:].decode()
|
# print(f"in pkg size > 0 loop before else data = {data}")
|
||||||
self.leftover = _index + _frame_size - MAX_FRAME_SIZE
|
# print(f"in pkg size > 0 loop before else index = {self.index}")
|
||||||
break
|
# print(f"in pkg size > 0 loop before else pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in pkg size > 0 loop before else leftover = {self.leftover}")
|
||||||
|
if self.leftover < 0 or self.leftover > 1024:
|
||||||
|
self.w2t("", 0, 111, 'red')
|
||||||
|
self.response += data[self.index:].decode()
|
||||||
|
self.leftover -= (len(data) - self.index)
|
||||||
|
self.pkg_size -= (len(data) - self.index)
|
||||||
|
self.index += MAX_FRAME_SIZE
|
||||||
|
self.reset_index = 1
|
||||||
|
# print(f"in pkg size > 0 loop after else data = {data}")
|
||||||
|
# print(f"in pkg size > 0 loop after else index = {self.index}")
|
||||||
|
# print(f"in pkg size > 0 loop after else pkg size = {self.pkg_size}")
|
||||||
|
# print(f"in pkg size > 0 loop after else leftover = {self.leftover}")
|
||||||
|
if self.leftover < 0 or self.leftover > 1024:
|
||||||
|
self.w2t("", 0, 111, 'red')
|
||||||
|
break # 该data内数据已经处理完毕,需要跳出大循环,通过break和index
|
||||||
|
# else:
|
||||||
|
# self.msg_storage(flag=0, response=self.response)
|
||||||
|
# self.flag = 0
|
||||||
|
# self.response = ''
|
||||||
|
# self.leftover = 0
|
||||||
|
# self.pkg_size = 0
|
||||||
|
# self.index -= 2
|
||||||
|
# self.reset_index = 0 if (len(data) > self.index > 0) else 1
|
||||||
|
|
||||||
def get_response_xs(self, data):
|
def get_response_xs(self, data):
|
||||||
if self.flag_xs == 0:
|
if self.flag_xs == 0:
|
||||||
@ -188,19 +468,19 @@ class HmiRequest(object):
|
|||||||
self.flag_xs = 1
|
self.flag_xs = 1
|
||||||
|
|
||||||
def get_from_id(self, msg_id, flag=0):
|
def get_from_id(self, msg_id, flag=0):
|
||||||
messages = self.c_msg if flag == 0 else self.c_msg_xs
|
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
|
messages = self.c_msg if flag == 0 else self.c_msg_xs
|
||||||
for msg in messages:
|
for msg in messages:
|
||||||
if msg_id is None:
|
if msg_id is None:
|
||||||
self.w2t("未能成功获取到 message id...", 0, 10, 'red', tab_name=self.tab_name)
|
return None
|
||||||
if msg_id in msg:
|
elif msg_id in msg:
|
||||||
return msg
|
return msg
|
||||||
sleep(1)
|
sleep(1)
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def package(self, cmd):
|
def package(self, cmd):
|
||||||
_frame_head = (len(cmd)+6).to_bytes(length=2, byteorder='big')
|
_frame_head = (len(cmd) + 6).to_bytes(length=2, byteorder='big')
|
||||||
_pkg_head = len(cmd).to_bytes(length=4, byteorder='big')
|
_pkg_head = len(cmd).to_bytes(length=4, byteorder='big')
|
||||||
_protocol = int(2).to_bytes(length=1, byteorder='big')
|
_protocol = int(2).to_bytes(length=1, byteorder='big')
|
||||||
_reserved = int(0).to_bytes(length=1, byteorder='big')
|
_reserved = int(0).to_bytes(length=1, byteorder='big')
|
||||||
@ -210,13 +490,13 @@ class HmiRequest(object):
|
|||||||
return f"{dumps(cmd, separators=(',', ':'))}\r".encode()
|
return f"{dumps(cmd, separators=(',', ':'))}\r".encode()
|
||||||
|
|
||||||
def unpackage(self, sock):
|
def unpackage(self, sock):
|
||||||
def to_read(conn):
|
def to_read(conn, mask):
|
||||||
data = conn.recv(MAX_FRAME_SIZE)
|
data = conn.recv(MAX_FRAME_SIZE)
|
||||||
if data:
|
if data:
|
||||||
# print(data)
|
# print(data)
|
||||||
self.get_response(data)
|
self.get_response(data)
|
||||||
else:
|
else:
|
||||||
print('closing', sock)
|
print('closing', conn)
|
||||||
sel.unregister(conn)
|
sel.unregister(conn)
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
@ -227,16 +507,16 @@ class HmiRequest(object):
|
|||||||
events = sel.select()
|
events = sel.select()
|
||||||
for key, mask in events:
|
for key, mask in events:
|
||||||
callback = key.data
|
callback = key.data
|
||||||
callback(key.fileobj)
|
callback(key.fileobj, mask)
|
||||||
|
|
||||||
def unpackage_xs(self, sock):
|
def unpackage_xs(self, sock):
|
||||||
def to_read(conn):
|
def to_read(conn, mask):
|
||||||
data = conn.recv(1024) # Should be ready
|
data = conn.recv(1024) # Should be ready
|
||||||
if data:
|
if data:
|
||||||
# print(data)
|
# print(data)
|
||||||
self.get_response_xs(data)
|
self.get_response_xs(data)
|
||||||
else:
|
else:
|
||||||
print('closing', sock)
|
print('closing', conn)
|
||||||
sel.unregister(conn)
|
sel.unregister(conn)
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
@ -247,22 +527,22 @@ class HmiRequest(object):
|
|||||||
events = sel.select()
|
events = sel.select()
|
||||||
for key, mask in events:
|
for key, mask in events:
|
||||||
callback = key.data
|
callback = key.data
|
||||||
callback(key.fileobj)
|
callback(key.fileobj, mask)
|
||||||
|
|
||||||
def gen_id(self, command):
|
def gen_id(self, command):
|
||||||
_now = time()
|
_now = time()
|
||||||
_id = f"{command}-{_now}"
|
_id = f"{command}-{_now}"
|
||||||
return _id
|
return _id
|
||||||
|
|
||||||
def excution(self, command, flg=0, **kwargs):
|
def execution(self, command, flg=0, **kwargs):
|
||||||
if flg == 0: # for old protocols
|
if flg == 0: # for old protocols
|
||||||
req = None
|
req = None
|
||||||
try:
|
try:
|
||||||
with open(f'{current_path}/../../assets/templates/{command}.json', encoding='utf-8', mode='r') as f_json:
|
with open(f'{current_path}/../../assets/templates/{command}.json', encoding='utf-8',
|
||||||
|
mode='r') as f_json:
|
||||||
req = load(f_json)
|
req = load(f_json)
|
||||||
except:
|
except:
|
||||||
print(f"暂不支持 {command} 功能,或确认该功能存在...")
|
self.w2t(f"暂不支持 {command} 功能,或确认该功能存在...", 0, 1, 'red', tab_name=self.tab_name)
|
||||||
return 'NOT SUPPORT'
|
|
||||||
|
|
||||||
match command:
|
match command:
|
||||||
case 'state.set_tp_mode':
|
case 'state.set_tp_mode':
|
||||||
@ -283,11 +563,11 @@ class HmiRequest(object):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
req['id'] = self.gen_id(command)
|
req['id'] = self.gen_id(command)
|
||||||
print(f"req = {req}")
|
# print(f"req = {req}")
|
||||||
cmd = dumps(req, separators=(',', ':'))
|
cmd = dumps(req, separators=(',', ':'))
|
||||||
try:
|
try:
|
||||||
self.c.send(self.package(cmd))
|
self.c.send(self.package(cmd))
|
||||||
sleep(2)
|
sleep(0.5)
|
||||||
except Exception as Err:
|
except Exception as Err:
|
||||||
self.w2t(f"{cmd}\n请求发送失败...{Err}", 0, 0, 'red', tab_name=self.tab_name)
|
self.w2t(f"{cmd}\n请求发送失败...{Err}", 0, 0, 'red', tab_name=self.tab_name)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user