基于串口Modbus协议的远程张力无线传输设计与实现
2019-10-21谢文桃
摘 要:石油勘探开发测井过程中,要实时监控电缆承受的张力,测井施工中通常在井口天滑轮上挂接张力计,利用通讯电缆连接张力计和测井工程车上的采集系统对电缆张力进行测量和监控。通讯电缆在施工过程中,不论井口还是地面会经常受到钻具等钻探工具设施的碰撞挤压而损坏,为了避免施工中发生此类问题而耽误工时,施工人员提出无线传输张力的方案。张力的采集和无线传输采用模块化设计,利用Modbus传输协议根据实际情况设置采集速度。工程车上配置控制用的工控机,把张力信号恢复成兼容原来绞车面板的模拟量,工控机内安装的控制软件能根据实际灵活配置串口及电池电压监控。
关键词:井口张力;无线传输;Modbus RTU串口协议;绞车面板
中图分类号:TN915.6 文献标识码:A 文章编号:2096-4706(2019)20-0064-03
Abstract:During the oil exploration and development logging process,the tension of the cable should be monitored in real time. In the logging construction,the tension meter is usually attached to the wellhead pulley,and the communication cable is used to connect the tension meter and the collection system on the logging truck. Tension is measured and monitored. During the construction process,the communication cable is often damaged by the collision of drilling tools such as drilling tools at the wellhead or the ground. In order to avoid such problems during construction,the construction workers propose a wireless transmission tension scheme. The tension collection and wireless transmission adopt modular design,and the acquisition speed is set according to the actual situation by using the Modbus transmission protocol. The industrial computer equipped with control on the engineering vehicle restores the tension signal to the analog quantity compatible with the original winch panel. The control software installed in the industrial computer can flexibly configure the serial port and battery voltage monitoring according to the actual situation.
Keywords:wellhead tension;wireless transmission;Modbus RTU serial port protocol;winch panel
0 引 言
測井工程中的井口张力计是用来测量测井电缆承受的拉力的重要工具,电缆张力的大小对于判断井下仪器和电缆是否遇阻和遇卡有极其重要的作用,是处理工程事故必不可少的参考指标。
本文提供的方法是将连接井口张力计和测井工程车的电缆用无线通信方式代替。利用串口Modbus RTU协议,通过安装在测井工程车的工控机进行远程张力信号的实时采集,然后在原有绞车面板上恢复出来便于监控。工控机运行的软件基于Win32平台,能对串口进行配置和读写操作,根据需要调整采集速率。
无线传输的最大好处是免去了电缆的布线,方便了施工,降低了工作量,提高了工作时效。
1 原理与设计
硬件系统主要包括模拟量采集模块,无线数据传输模块,工控机控制端,模拟量恢复模块。软件系统依托32位Windows系统开发,根据Modbus协议对串口进行配置和读写操作并把收到的数据发送给模拟量恢复模块,图1所示是整个系统结构。
采集模块对张力计的模拟信号以及电源电压等模拟量进行高精度模数转换,然后利用RS-485总线按照Modbus协议标准向控制端传输数据。无线模块负责信号采集端和控制端的连接。模拟恢复模块将控制端分离出的数字信号数模转换出模拟信号进入绞车面板处理和显示。按照由远至近顺序依次配置各个模块的设备ID,采集模块地址为01,连接采集的无线发送模块配置为02,连接工控机的无线模块为03,数字转模拟模块为04。串口的配置使用波特率9600,起始位1,数据位8,无校验位,停止位1。
1.1 Modbus协议概述
Modbus协议(如图2所示)是运行在RS-485物理接口上的半双工的主从协议,在协议中,主从机通过报文即数据帧进行请求——应答通信,一个数据帧包含了地址域,功能码,数据,差错校验。传输分两种模式,ASCII模式和RTU模式,本文所涉及功能用的是RTU模式。
地址域(信息地址)在帧的开始部分,由8位组成,有效的从机设备地址范围为0~247(十进制),单个设备的地址范围是1~247。主设备通过将要联络的从设备的地址放入消息中的地址域来选择从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。
功能码告诉了被寻址到的终端执行何种功能。有效码范围1~225(十进制),有些代码适用于所有控制器,有些适用于某种控制器,还有些保留以备后用。
数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。数据区有2个16进制的数据位(2的8次方256),数据范围为00~FF(16进制)。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。数据区的长度可为“零”以表示某类信息。
允许主机和终端检查传输过程中的错误。有时,由于电噪声和其他干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余的方法,即CRC校验。循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,再与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误,接收端将放弃此帧数据。
1.2 控制端软件
控制软件功能包括选择串口、打开和配置串口、读写串口等。软件默认使用COM1和COM2,
char* A ="COM1" ;
char* B ="COM2" ;
默认设置适用于大多数工控机,但是也可以在程序开始运行一段时间内由键盘输入选择串口的功能,如不选择则使用默认串口。
串口选择在提示后根据实际配置输入相应的数字,代码如下:
void InputCom(void)
{
int num ;
printf("请输入串口A的号\n");
scanf("%d",&num);
switch(num)
{
case 1:
A ="COM1";
printf("%s\n",A);
break;
case 2:
A ="COM2";
printf("%s\n",A);
break;
case 3:
A ="COM3";
printf("%s\n",A);
break;
case 4:
A ="COM4";
printf("%s\n",A);
break;
}
第二个串口选择的代码同上。
打开和配置端口代码:
void OpenConfigCom(TCHAR* A,TCHAR* B)
{
hComA =CreateFile(A, GENERIC_READ |GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
0, NULL);
if(hComA==INVALID_HANDLE_VALUE)
{
printf("打開串口A失败");
}
BOOL error=SetupComm(hComA,1024, 1024);
if(!error)
printf("设置串口A失败"); error= GetCommState(hComA, &dcb);
if(!error)
printf("获取串口A状态失败"); dcb.BaudRate=9600;
dcb. ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
error =SetCommState(hComA,&dcb);
if(!error)
printf("设置串口A状态失败");
下面设置第二个串口B,代码相似此处省略。
}
定义发送给采集端的固定协议帧:
unsigned char sendA[8]={0x01, 0x03, 0x00, 0x05, 0x00, 0x02, 0xD4, 0x0A};
发送给数模转换的协议帧:
unsigned char sendB[9]={0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00};
采集端返回的内容预置:
unsigned char recvA[9]={NULL};
下面是利用循环进行张力的采集和恢复:
while(ch!=27) //按下ESC键退出程序
{
BOOL bRet= WriteFile(hComA, sendA, 8, &comnum, NULL);
if(!bRet)
printf("向COMA发送数据失败");
bRet=ReadFile(hComA, recvA, 9, &comnum, NULL);
if (!bRet)
printf("读取串口A失败");
此处是数据位提取:
sendB[4]=recvA[3]; // sendB[5]=recvA[4];
发送给模拟信号恢复端的CRC16校验码的计算:
unsigned char a[8]={NULL};
unsigned int b;
unsigned char crc_H,crc_L;
for (int i=0;i<6;i++)
{
a[i]=sendB[i];
}
b = getCRC16(a,6);
crc_H = ((b>>8) & 0x00ff); crc_L = (((b<<8)>>8) & 0x00ff); sendB[6]=crc_H;
sendB[7]=crc_L;
getCRC16(a,6)函数是调用相关计算CRC的函数。
bRet=WriteFile(hComB, sendB, 8, &comnum, NULL);
if(!bRet)
printf("向COMB发送数据失败");
Sleep(500);
休眠时间可调节数据传输频度。
if(_kbhit())
ch=_getch();
}
2 实验和结论
(1)在实验室单独给采集模块提供标准的电压信号,实验室主机上运行串口调试助手软件,通过无线传输,获得采集端的数据。由于是通过数字化传输,数据完整,不存在模拟量受电缆长度衰减和干扰的影响,然后把得到的数据通过另一个串口发送到模拟量恢复模块,测量到和采集模块输入相同的电压值,精度完全满足工程要求。
(2)硬件模块化的好处是可以按照设计的要求灵活配置,在这种传输数据量较小的场合尤其可以体现出串口的Modbus协议的优越性,协议的总线结构正好配合硬件模块化的设计,为将来进一步升级提供了广阔的空间。
(3)无线功能的实用化很大程度上依赖电池容量的大小,电池的容量要满足测井开始到结束的时间要求,同时安全性也是很重要的一环,系统除了要监测电池电压及工作温度,保持电压的稳定也很重要,因此实际使用中采集端加入了稳压模块。
参考文献:
[1] 谭浩强.C/C++程序设计 [M].北京:清华大学出版社,2004.
[2] 張铮.Windows程序设计 [M].北京:人民邮电出版社,2015.
[3] 杨更更.Modbus软件开发实战指南 [M].北京:清华大学出版社,2017.
作者简介:谢文桃(1969.03-),男,汉族,江苏南京人,高级工程师,本科,研究方向:测井相关仪器设备研究。