数码之家

标题: 给智能空气开关开发配套软件 [打印本页]

作者: garyjohnson    时间: 2024-1-6 15:47
标题: 给智能空气开关开发配套软件
本帖最后由 garyjohnson 于 2024-1-6 16:07 编辑

最近接了个私活,给智能开关开发配套软件,需求是控制开关打开和关闭,读取电压、电流等信息,整体思路是很简单的,就是简单的并口收发,但实际开发过程中踩了很多坑,跟大家分享一下

软件界面镇楼

[attach]2013141[/attach]

[attach]2013166[/attach]


头一次听说modbus这个协议,研究了一下,这个协议是由8个16进制数组成,第一个是设备号,第二个是方法,第三、第四是寄存器地址,第五、第六读取操作是长度/写入操作是数据,第七、第八是校验位

例如这样:01 03 00 34 00 01 C5 C4


设备号就是设备的编号,可以多个设备并口并联,根据设备号向对应的设备发送指令

方法主要用03和06,03读,06写

最大的坑:当执行port.Read的时候,第一次只返回设备号,第二次才会返回一个byte数组,数组的第二个元素开始是数据,有的是两个(文档中单个地址的),有的是四个(文档中带~的,两个地址的,需要分别判断并转换为数据),我之前没发现这个问题,无论怎样都返回只有一个元素01的数组,后来写了个10次循环,看到每次从缓冲区中读出来的结果,才发现这个问题


第一个坑:文档里单位不对,写的是V,好在有破解IC卡的经验,研究了一下返回的16进制数,发现两个拼接在一起是以mV为单位的电压,例如返回00 03 AA 36,就把它们连起来,然后换成10进制就是240182mV,240.182V,电流同理,文档也是错误的,转换后是mA


[attach]2013146[/attach]

发送:01 03 00 18 00 02 44 0C
第一次返回:01
第二次返回:03 00 03 AA 36 ……很长一串,只取第二、三、四、五个值


第二个坑,我之前以为直接发送01或04就可以打开、关闭开关,结果不是这么个事,需要向地址02 50中写入01才可以执行打开开关的操作,这个要仔细看文档才能找到

例如打开开关的指令是:01 06 02 50 00 01 49 A3


[attach]2013144[/attach]

[attach]2013145[/attach]

第三个坑:之前我老怕它失败,用的是08(强制分闸),然后发现执行08以后就不能执行01了,手工推也推不上去,看来这设备安全性还是可以的


附全套代码(为了兼容性没有使用第三方modbus库,全靠手工拼接):
https://url67.ctfile.com/f/22262267-1000041904-beb1aa?p=9963 (访问密码: 9963)

[attach]2013155[/attach]


作者: 数码家园    时间: 2024-1-7 08:52
厉害了
还分享了代码,虽然我看不懂
作者: mhtlov    时间: 2024-1-7 09:01
有借鉴意义
作者: 275319932    时间: 2024-1-7 10:11
写了Y/1000了吧

modbus是工业上最常用的通讯协议了。
作者: soma    时间: 2024-1-7 12:37
485设备最常用的协议,支持多设备公用一条数据线
作者: jalor    时间: 2024-1-13 19:27
请教,马云家卖的涂鸦智能计量空气开关,其电流读取方式是什么?
作者: garyjohnson    时间: 2024-1-13 20:36
@jalor 这个你只能看文档或百度查 要是需要研究什么得送我个设备 我手里没有




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4