【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
? ? ? ? 上位机如果本身只是纯文本数据的开发,也就是之前说的从文本中读数据、从文本中写数据这种,那么它基本真的不需要和外界打交道。但是,还有一大类的上位机软件,它们是需要和各种设备打交道的。那么,如果是这种的话,就势必涉及到上位机和设备之间的通信方式,如果不是直连的,通常有网络、蓝牙这两种方式;如果是直连的,那么一般是232、485、can这种。不管是哪一种方式,接入了设备,就相当于上位机有更多的信息输入,也就有能力建立更多的业务模型,对于上位机功能上的拓展还是很有帮助的。
? ? ? ? 前面说过,232、485、can、网络是目前上位机和外接设备打交道最多的方式。其中232、485和can是低速设备,网络属于中高速设备。当然,工业中的网络如果是无线,一般也不会好到哪去。如果是有线的话,那么问题不大。另外一种通信方式就是usb,通常用先用zadig安装一个libusb驱动,接着再用libusb库去和下位机进行通信。
? ? ? ? 具体通讯协议的部分,取决于下位机是谁开发的。如果下位机是研发小伙伴自己做的,那么协议怎么写,其实并不那么重要,只要两者遵循一定的数据格式,可以建立上下游通信的链路就可行。不过大部分的设备,都是采购的。这个时候,就要学习厂家提供的通信协议。这些协议中,有些是私有的,有些是modbus的;有些是提供代码的,有些是需要自己写的;有些是简单的协议,有些交互逻辑比较复杂。当然不管是哪一种,如果有可能,尽量选用通用设备、标准协议,这样在开发效率上会提高很多。
? ? ? ? 很多同学不会看厂家给出的文档。其实完全没有必要,大部分文档都有详细的说明。因为一个产品要想卖给尽可能多的客户,那么在产品说明上面,就必须兼顾到所有的用户认知水平。因此,文档上面不可能做的很复杂。下面,我们就简单了解一下一个485 io设备的协议是怎么编写的,
? ? ? ? 这是一个两路的do设备,接口是485。写协议呢,其实没有想的那么复杂,依次往里面填写数据就好了。比如这里填写的数据是0x010100640002FC14。整个数据都是16进制。其中,01代表设备地址,01代表功能码,0064代表寄存器地址是100,0002代表要读两个寄存器,FC14是校验码。
????????上位机给下位机发出命令之后,如果没有什么意外的话,下位机就会很快回复一组数据。这里回复的数据是0x01010102D049。回复的数据也是16进制。01代表地址,01代表功能码,01代表数据长度,也就是后面跟着1个字节的数据。02代表数据,换成二进制就是00000010,1表示断开,0表示闭合,既然是两路开关,那么返回数据让我们明白,目前开关0是闭合的,开关1是打开的。D049是校验码,略过。
? ? ? ? 之前是发送读do的命令,这一次是写do的命令,我们继续看下。整体的数据是0x010f0064000201022E9E。同样,数据也是16进制。相比较之前,数据长度发生了变化,我们依次来看。01代表地址,0F代表功能码,0064是寄存器地址,0002是寄存器长度,01代表数据长度,02代表数据。其中02的数据,换成二进制就是00000010,1代表闭合,0代表断开,这里相当于要求把do1闭合,把do0断开。2E9E是校验码,这和之前是一样的。
? ? ? ? 写do状态的回复数据就很简单了,基本上就是处理一下之前发的命令,将数据长度和数据抽掉,这就是上位机接收到的返回数据。当然校验码肯定还是要重新计算的。
? ? ? ? 实际通信测试会遇到很多的问题。这些问题包括不限于,1)无法接收到数据;2)数据格式不对;3)数据大小端不对;4)数据bit不对;5)协议版本不对;6)回复数据超时严重等等。总之,实际开发的过程当中会遇到各种情况。为了处理这些问题,除了日常的硬件接口检查之外,软件上自己也要做好保护,比如说一定要引入写入、回读确认机制,还要做好定期检查机制,此外任何的实际操作命令发出之前,必须对操作条件进行详细、认真的检查确认,宁可不执行相关的操作,也要做好完善的数据和参数检查工作。