基于串口通信的稳牌加油机数据采集系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于串口通信的稳牌加油机数据采集系统摘要:鉴于市场上加油机内控系统通信模块速度低、功能单一、价格
高的现状,针对稳牌加油机设计出高速高效多功能的内控系统。

该内控系
统是加油站的数据库管理系统和加油站的所有加油机之间进行交互的接口。

使用该数据库管理系统,加油站人员可以方便地获取加油机的数据和状态,并可以根据需要对加油机的当前状态加以改变。

该内控系统在文中都称之
为数据采集程序。

文中描述了串口通信、进程间通信和多线程的技术。

关键词:线程同步;异步方式;串口通信;半双工
一、引言
加油机处于外控模式时,加油站工作人员需要人工读取加油记录,并
手动填写小票,记账,并且需要人工计算出每班,每天,每月的账表。


费大量人力和时间,并且容易出错,大型的加油站更是如此。

因此,为提
高加油站运行的效率,实现加油站管理的自动化,加油站的数据库管理系
统应运而生。

该数据库管理系统的一个关键部分,就是内控程序,用来获
取加油机上的加油记录。

较完善的内控系统,还能够对加油机的状态进行
必要的控制,例如,预置加油(预先给加油机设置加油金额或数量),脱
枪操作(停止对指定枪的使用,可以重新联机并正常工作),获取累计数(获取指定枪的跑字数)等。

二、基本功能设计
外控时,加油人员一提枪,加油机就会总清授权,然后加油人员,扣
动扳机就可以加油。

加油机的枪状态有提枪和挂枪两种状态,加油机本身
有七种状态:总清、授权、正在加油、加油打到最大值、加油完毕、关机、未编程。

一般情况下我们要把加油机控制在下面的状态循环中:
其中,挂枪和提枪是操作员对枪的操作,总清、授权、停止是采集程
序向加油机发送的指令
三、硬件系统结构设计
稳牌加油机采用的是RS485通信接口,RS-485收发器采用平衡发送
和差分接收,因此具有抑制共模干扰的能力。

RS-485标准规定:数据信
号采用差分传输方式(differentialdrivermode),也称为“平衡传输”。

它使用一对双绞线,将其中一根线定义为A,另一根线定义为B。

RS485
在发送端TXD将串行口的TTL电平信号转换成差分信号A、B两路输出,
经传输后在接收端将差分信号还原成TTL电平信号。

PC机上自带的COM1
口和COM2口都是RS232通信接口,RS-232采取不平衡传输方式,,收、
发端的数据信号是相对于信号地的电平。

PC机上的串口经由一个
RS232/485转换器进行信号转换,然后就可以直接连接到稳牌加油机主板
的485串口上。

所有的加油机通过RS485现场总线进行物理链路连接,连
接到RS232/485转换器引出的485串行总线上。

通过采集程序调度实现
PC机对各个加油机的轮巡,使得PC机可以连续地依次地与每个加油机进
行点到点的通信。

四、软件系统结构:
4.1采集程序的开启
采集程序是由管理程序调用函数CreateProcess()打开的,在采集程
序启动后,管理程序将运行参数发送给采集程序,之后采集程序才开启工
作线程对加油机进行巡检。

采集程序采用了两个命名的事件对象,其中一个由管理程序创建并设置为有信号状态,采集程序在启动时只有当命名事件一为有信号时才能正常启动,否则会直接退出,也就是说事件一控制了打开采集程序的权限;命名事件二由采集程序自身创建并设置为有信号状态,采集程序在启动时若检查到事件二为有信号时也会立即退出,事件二保证了采集程序只能存在一个实例。

4.2线程间通信
线程间通信方式有全局变量,消息,指针等,采集程序中线程间的通信采用的是指针方式,通过共享一组存储变量实现的。

这组存储变量包含在一个结构体变量中,这个结构体变量是由主线程定义的,主线程在启动工作线程时将该变量的指针作为参数传递给工作线程。

两个线程之间的交互就是通过读写该变量来实现的。

两个线程访问共享变量的代码部分需要进行同步,采集程序中是采用临界区实现的。

4.3进程间通信方式
进程间通信方式有socket、邮槽、管道、消息、剪贴板等,采集程序中采用的是消息传递方式,即调用SendMessage()发送WM_COPYDATA消息。

管理程序中接收该消息的是一个独立的线程,因为SendMessage()的表现是阻塞性质的,它要等到消息响应完成之后才会返回,所以管理程序需要一个独立的线程来处理该WM_COPYDATA消息,保证WM_COPYDATA消息能得到快速正确的处理,避免采集程序的工作线程在发送消息时挂起而中断对加油机的巡检。

主线程是在采集程序启动后就开启的一个线程,它是带消息循环的线程,在采集程序中,它的主要职责就是以消息的方式与管理程序进程之间进行交互。

进程间进行通信需要获取目标窗口的指针或句柄:
CWnd*pWnd=(CWnd*)CWnd::FindWindow(NULL,strWindowCaption);
4.4PC机和加油机之间的串口通信:
初始化串口,主线程在接收到来自管理程序的0x300开头的开头的命
令后,读取其中的加油机和加油枪等参数并保存在线程间共享的结构体变
量中。

收到0x301开头的命令后调用CreateFile()函数打开指定串口并
根据需要初始化串口的参数。

接着检测管理程序告知的各个加油枪的联机状况,完成这些工作之后,调用函数AfxBeginThread()开启工作线程,将线程间共享变量的指针作为
参数传递给工作线程,工作线程是一个没有创建消息循环的线程,以循环
巡检的方式进行工作,是否退出该循环,由共享结构体变量中的一个布尔
型变量来控制,让线程监视该变量,当该变量为真时,则退出循环,从而
保证线程安全退出,释放线程堆栈、删除线程对象等资源。

PC机和加油机之间采用的是异步方式的串口通信。

稳牌加油机的协
议中规定了每次异步传输都以加油机的地址(占用一个字节)开头,它通
知指定的加油机或者PC机接收数据已经到达了,这就给了接收方响应、
接收和缓存数据比特的时间。

对于接收数据的加油机来说,只有与命令中
携带的通信地址相吻合的加油机才负责应答计算机的命令。

在传输结束时,以两个十六进制数0xfa表示一次传输的终止。

整个数据帧当中如果有
0xfa的数据,将被替换成0x10和0xfa,然后才能被传输,在加油机协议中,这被成为透明码,与数据帧的结束码区分开来。

PC机与稳牌加油机的串口通信有其特殊性,首先通信线路是半双工的,数据只能从PC机传到加油机或者从加油机传到PC机,在同一时刻只
能有一个方向上的传输存在,输入过程和输出过程使用同一通道。

如果
PC在发数据时,加油机也在向PC发数据,这就是通常所说的总线冲突;
其次,加油机的响应时间t并不是固定的,时间t是指加油机从接收完属
于自己的数据,到开始作出响应的时间间隔,实验证明t的最大值大约为40ms。

由于加油机的这两个特点,如果程序对串口收发数据处理的不恰当,就既极有可能无法获取正确的数据,只能得到无法识别的乱码。

为了提高
对加油机巡检的速度和接收数据的正确性,我们需要对串口的进行恰当的
超时设置。

4.5工作线程实现流程
实际当中要解决的问题比较多,程序编制起来也是比较复杂,流程图
画起来占用篇幅比较大,这里只把工作线程的主要功能和简图画出来。

五、结束语
采集程序采用VC++编程,将Windows的多线程技术,异步串口通信,进程间通信三者结合起来,充分发挥三者编程的优势,提高了PC机对各
个加油机轮流巡检的速度,提高了数据采集的实时性和准确性,实现了高
性能的加油站管理系统。

该应用系统最多可以连接32台加油机,这是由485芯片的负载能力决定的。

使用该采集程序的加油站管理系统现在已经
在多个加油站运行,取得了良好的效果。

笔者创新观点:结合多线程技术、进程通信和异步串口通信,采集程
序以轮流检测的循环方式对各个加油机进行访问和控制,并将结果反馈给
加油站的管理程序。

相关文档
最新文档