易语言是入门级的中文编程语言,语法通俗易懂使也与人员程序开发的周期大大缩短。采用易语言作为编程语言对于我们理解通讯和计算机原理有很大帮助。
前一个文章我们制作了读I区的子程序:ReadI(命令标识符,读取数量,寄存器位,超时时间)。前面的文章我们只讲到了生成了发送请求的命令,那么命令返回之后该怎么处理呢?继续讲我们剩下的几个子程序。
接着讲收到数据后的两个子程序
因为是非公开子程序,所以就用易语言自带的比较方便的写法,随便定义为OOOOOO,看个人喜好。数据收到后是否成功读取了寄存器,以及出现的错误代码,并返回data部分的代码。
一、前半部分判断
1.1判断收到了正确的返回代码
因为TPKT+ISO-COTP的代码是位数固定的,所以我们需要判断前面长度是否正确就行,即我们需要截取S7Comm部分,判断第一个字节是不是版本信息。这里的收到数据,是字节集型的,调用方传递的客户机收到的数据字节集。
根据上一节讲的S7Comm的结构发现,S7Comm的固定字节是12个,那就好办了。我们直接解读就行了。
1.2判断是否与请求对应并选出data的字节集内容
如何判断这次收到的数据和请求数据是对应关系呢,除了正确的使用延时功能,还有判断数据标识符的累加值是不是和发送的代码一至。
所以剩下的全部代码我是这样写的:
很简单吧,其中用到的子程序“字节集转整数”是我自己写的,因为2个字节的字节集转整数在易语言中需要翻转字节集才行。不懂的自己百度哈。
其实就是按照每个字节所在的位置读取,各个参数。有需要的可以自行获取。这里有用的就是数据长度,就是data的字节数,我们把这个数量的数据截取就是data的代码,作为子程序的返回结果。
二、对结果进行解析
收到的数据结构和发出的数据结构是不同的。发出读的命令的数据结构到Parameter就结束了,item是放在Parameter中的,而收到的数据代码中在Parameter之后还有data,作为响应结果,item值包含在data之中的。具体结构如下所示。
ReturnCode:00表示失败,FF表示成功
TransportSize:Bit数量,表示总的二进制长度
剩下的就是数据内容了,奇数字节数量的时候需要补“00”也就是Fillbyte。也就是数据长度只能是8的倍数。
好了直接上代码。
返回数据是0
0
1
0
0
1
0
1,这样的文本,可以作为后期处理备用。
第一个表示I0.0状态,以此类推,之后一个表示I0.7的状态。
0表示断开,1表示接通。