网关2代码的进一步理解

代码的基本流程步骤:

1.组态王先给网关2下发8个字节的命令


由串口3来接收,然后串口3发生中断,由于Uart3_rev_flag未赋值,所以中止,到了3.5ms后定时器2发生中断,判断是否接收完8个字节的数据,然后将Uart3_rev_flag置1,再返回刚才串口3中断中止的地方继续往下执行,将串口3接收到的数据存放在数组ReceBuf[recenum] 里

2.又过3.5ms后,由于串口3没有接收到的新数据,所以定时器2不执行中断,直到1s后,定时器3也进来中断,但由于Data_Check_Flag未赋值,所以定时器3也不执行中断

3.2s后定时器4发生中断,一直发生中断Query_period(60)次后,将pack_num=0;pack_num2=0;Answer_Flag=0;将网关1-1 ID赋值给Send_Message_data.GW1_ID,然后进入Reply_GW(GW_Command_data)函数,对网关1-1进行查询,将要查询的信息存在数组GW1_send_Message[]里,然后再将这组数据传给串口2,串口2通过485线下发给网关1,同时将这组数据打印出来


4.在上一步定时器4一直中断60次,2分钟里,定时器2和定时器3也在一直发生中断,但由于无状态变化,所以不往下执行。

5.后来网关1接收到数据并查询完毕后,将查询结果再次通过485线回发到网关2的串口2里,串口2接收到数据后产生中断,将串口2接收到的数据存到数组Com_GSM_data[Com_GSM_data_cp]里,判断是否接收到了结束符0x2f,然后将Data_Check_Flag置1

6.1s后定时器3发生中断,因为Data_Check_Flag==1,进入receiveuart2()函数解析网关1回发的数据,解析完之后一直往下执行,由于刚开始下发的命令为Command_ID==0x02查询命令,然后将Message_data.Command_ID变为0x03查询应答,再将网关2应答的数据存到数组GW1_send_Message[]里,再将这组数据传给串口2,同时将这组数据打印出来,将Data_Check_Flag=0

ae00010401730000002f 此时功能码已变成查询应答3

然后串口2通过485线将网关2应答的数据下发给网关1.(到这一步已经查询完第一节点并成功上报给网关2)

7.4s后,网关1又将查询第二节点的数据上报给网关2,还是由串口2来接收,然后不断地重复第5,6步,一直查询完所有节点,然后将所有节点数据加起来赋值给 COM_data.Com_total

8.最后才回到主函数执行ParseRecieve8()函数,处理刚才组态王下发的数据以及把相应的数据以Modbus格式存到数组SendBuf[]里,然后传到串口3里,通过串口3上报给组态王


判断设备地址是否匹配,若匹配就往下进行数据的处理,CRC校验,判断数据中的功能码(目前我们只用到03查询命令功能码)

a .若是03功能码,则往下判断寄存器起始地址,然后计算回发的字节数,有用的数据长度(=总字节数减去2位CRC校验码)

b .将接收到从组态王发来的数据按照MODBUS协议依次存放在发送缓冲区里

c .然后将这个发送缓冲区里的数据传送到串口3里

查询完网关1-1后再查询网关1-2,网关2每隔2分钟查询一遍网关1-1

  查询一个节点就上报一个节点给网关2,还有打印出当前查询节点的数目,如果当前查询的节点数目已达到10,则把所有节点的信息打包上传给组态王,同时打印“上传组态王数据:”

 查询完网关1-1后,再继续查询网关1-2,如果当前查询的节点数目已达到2,则把所有节点的信息打包上传给组态王,同时打印“上传组态王数据2:”


程序就是一遍又一遍地不断重复执行,组态王并不是只下发一次命令,而是隔5分钟又给网关下发一次命令

在弄懂任何一个程序代码时,都必须结合它相应的通信协议来看,单纯地看代码是弄不懂的










猜你喜欢

转载自blog.csdn.net/qq_38021919/article/details/79119246
今日推荐