工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟电信号才能传输到几百米外的监控室或显示设备上。因为电流信号不易受干扰,工业上广泛采用4~20mA电流来传输模拟量。4mA表示0%的信号,可以区分0%信号和电路断开;20mA表示100%的信号,其通断引起的火花能量不足以引燃瓦斯。而控制端需要采集这个模拟电流量,将其转换成数字量进行处理。
一、硬件方案
工业上除特殊要求需要自己设计模拟电流采集电路以外,通用的比较高效、低成本的模拟电流采集方案一般是直接购买专门厂商的模拟量采集模块(俗称亚当模块)。配合上工控主机,可以实现下图所示的采集流程:电流变送器将传感器返回的非标准信号转换成4~20mA的模拟电流信号进行传输;亚当模块是一个ADC模块,采集4~20mA的模拟电流,转换成数值存放于寄存器中;主机通过RS485总线访问各个模块,得到相应寄存器的数值进行处理。
图1 模拟电流采集示意图
针对4~20mA模拟电流的采集,市场上有许多厂商都能提供不同性能、不同价格的亚当模块,这些模块通过RS485总线接口与主机通信,通信协议是modbus RTU。英创主板提供RS485接口和modbus库文件,能够作为485主机,与亚当模块构成模拟电流采集系统,并进行相应处理。目前,我们对市场上满足4~20mA输入范围要求的一些亚当模块做了比较详细的评估,英创主板都能与它们正常通信,完成对模拟电流的采集处理。在9600波特率下,我们用5位半电流表对各个厂商不同产品的测量精度进行了评估(最低0.2%),具体情况及其他参数见表1,不同需求的客户可以参考下表进行亚当模块的选型。
表1 模拟电流采集模块参数比较
研华的ADAM-4107+只要1146元,与ADAM-4117的区别主要是通道不能单独设定输入范围,采样率只有10Hz(total),用户可以评估一下
实际就是单端,只是为每个通道提供了一个单独的地信号接头
大于30,9600波特率受限于读函数一次耗时约30ms,最大能测到约30Hz;当波特率在115200时,读一次时间约20ms,最大约能测50Hz,100次读耗时不到2s,结果93次不同,表明差不多有50次/秒。受限实验条件,不能验证是否能达到100次/秒
adam-4117测电流要打开外壳,改变跳线,在PC上设置地址采样率(转换速率)等参数,可以只enable一个通道,则这个通道的采样率就是总的采样率(大于30Hz/total测试过程通注释3),如果enable多个通道,则每个通道平分总的采样率。
误差除以量程为测量精度,5位半电流表测量值作为真实值;可以通过测试最大电流的采样值和最小电流的采样值重新标定采样值范围,修改换算公式的值来进一步改善
各个模块设置不同的地址后,两两联网,485通信没有问题
此外,市场上还有更低成本的低精度、单通道亚当模块,只要其支持标准的modbus RTU协议,物理通信接口为RS485就能配合英创主板使用,设置成不同地址后,可以组建RS485网络,通过英创提供的modbus库函数进行访问。不同模块与英创主板的连接如图2所示。
图2 不同亚当模块与英创主板连接
二、应用软件编程
Modbus是工业控制器网络通信协议中最常用的协议之一,其通信采用主从方式,在同一个网络中有一个主设备及最多达255台从设备。工业上一般使用modbus RTU模式,以16进制传送数据,一个字节就是一帧,效率高于modbus ASCII模式。一个典型的modbus协议数据包由若干帧组成,如图3所示:
图3 modbus数据包格式
其中,第1帧为从机地址,第2帧为功能码,第3、4帧为主机欲访问的从机的起始寄存器地址,第5、6帧为要访问的寄存器个数,最后两帧为16位CRC校验码。对任何一个 ModBus协议数据包,其第 1、2帧及最后两帧的意义都是相同的,其他帧则根据功能码不同而有所区别。
英创提供的libmbusmaster.a库实现了modbus协议,支持常用功能码,详细介绍请查阅网站文章《ModBus通讯协议软件包》、《英创嵌入式Linux工控主板支持Modbus主控协议软件》、《Linux下的Modbus设备方协议软件介绍》。
下面就linux系统下,使用英创提供的libmbusmaster.a库文件进行模拟电流采集应用编程作简单介绍,更详细的过程请参考具体例程。
1、打开串口设备
sprintf( hostName, “ttyS3:9600-8-1-0”);
hPort = mbusMaster_OpenPortProtocol( hostName );
2、设置modbus通信超时时间
i1 = mbusMaster_SetTimeout( hPort, 2000 );
printf( “SetTimeout:%dn”, i1 );
3、读取亚当模块转换结果寄存器,处理读取值
result = mbusMaster_ReadMultipleRegisters( hPort, moduleAddr, startAddr+channelStart,dataArr,channelCnt);
if (result == 0)
{
sampleCnt++;
printf(“*****sample %d*****n”,sampleCnt);
for (i1 = 0; i1 《 channelCnt; i1++)
{
value[i1] = CalculateCircuit(moduleID, dataArr[i1]);
printf(“[%d]:t%hdt0x%04xt%0.4fn”, i1 , dataArr[i1], dataArr[i1], value[i1]);
}
}
else
{
strcpy( str,mbusMaster_GetErrorText( result ) );
i1 = strlen( str );
if( i1》0 )
{
printf( “%s!n”, str );
}
}
其中,CalculateCircuit是根据不同模块的转换公式将读到的数值转换成对应的电流值。在使用mbusMaster_ReadMultipleRegisters读取寄存器值时,要参照各模块的手册,传递不同的寄存器映射地址。如果读取失败,可以通过mbusMaster_GetErrorText函数提示失败原因。
4、关闭串口设备
mbusMaster_ClosePortProtocol( hPort ); 如果用户对4~20mA模拟电流采集应用方案感兴趣,可以联系我们。我们将提供表1所有的模块信息及程序示例。
三、总结
目前,市面上亚当模块(模拟数采模块)在价格、性能、通道数上有非常灵活的选择,单通道的亚当模块最低不到¥100元就能买到。综合我们的测试情况来看,主控部分使用英创主板,模拟数据采集部分使用市面上成熟的亚当模块,是工业上一种快速构建4~20mA模拟电流采集硬件平台的方案,并且具有很高的灵活性,能够满足用户的不同需求。此外,英创的libmbusmaster.a库文件实现了modbus协议的常用功能,用户只要简单的调用几个函数,就能完成软件上的编写,大大减少了整个产品的开发周期,降低了开发难度。因此,此方案具有简单、高效、灵活、低成本的优势。
工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟电信号才能传输到几百米外的监控室或显示设备上。因为电流信号不易受干扰,工业上广泛采用4~20mA电流来传输模拟量。4mA表示0%的信号,可以区分0%信号和电路断开;20mA表示100%的信号,其通断引起的火花能量不足以引燃瓦斯。而控制端需要采集这个模拟电流量,将其转换成数字量进行处理。
一、硬件方案
工业上除特殊要求需要自己设计模拟电流采集电路以外,通用的比较高效、低成本的模拟电流采集方案一般是直接购买专门厂商的模拟量采集模块(俗称亚当模块)。配合上工控主机,可以实现下图所示的采集流程:电流变送器将传感器返回的非标准信号转换成4~20mA的模拟电流信号进行传输;亚当模块是一个ADC模块,采集4~20mA的模拟电流,转换成数值存放于寄存器中;主机通过RS485总线访问各个模块,得到相应寄存器的数值进行处理。
图1 模拟电流采集示意图
针对4~20mA模拟电流的采集,市场上有许多厂商都能提供不同性能、不同价格的亚当模块,这些模块通过RS485总线接口与主机通信,通信协议是modbus RTU。英创主板提供RS485接口和modbus库文件,能够作为485主机,与亚当模块构成模拟电流采集系统,并进行相应处理。目前,我们对市场上满足4~20mA输入范围要求的一些亚当模块做了比较详细的评估,英创主板都能与它们正常通信,完成对模拟电流的采集处理。在9600波特率下,我们用5位半电流表对各个厂商不同产品的测量精度进行了评估(最低0.2%),具体情况及其他参数见表1,不同需求的客户可以参考下表进行亚当模块的选型。
表1 模拟电流采集模块参数比较
研华的ADAM-4107+只要1146元,与ADAM-4117的区别主要是通道不能单独设定输入范围,采样率只有10Hz(total),用户可以评估一下
实际就是单端,只是为每个通道提供了一个单独的地信号接头
大于30,9600波特率受限于读函数一次耗时约30ms,最大能测到约30Hz;当波特率在115200时,读一次时间约20ms,最大约能测50Hz,100次读耗时不到2s,结果93次不同,表明差不多有50次/秒。受限实验条件,不能验证是否能达到100次/秒
adam-4117测电流要打开外壳,改变跳线,在PC上设置地址采样率(转换速率)等参数,可以只enable一个通道,则这个通道的采样率就是总的采样率(大于30Hz/total测试过程通注释3),如果enable多个通道,则每个通道平分总的采样率。
误差除以量程为测量精度,5位半电流表测量值作为真实值;可以通过测试最大电流的采样值和最小电流的采样值重新标定采样值范围,修改换算公式的值来进一步改善
各个模块设置不同的地址后,两两联网,485通信没有问题
此外,市场上还有更低成本的低精度、单通道亚当模块,只要其支持标准的modbus RTU协议,物理通信接口为RS485就能配合英创主板使用,设置成不同地址后,可以组建RS485网络,通过英创提供的modbus库函数进行访问。不同模块与英创主板的连接如图2所示。
图2 不同亚当模块与英创主板连接
二、应用软件编程
Modbus是工业控制器网络通信协议中最常用的协议之一,其通信采用主从方式,在同一个网络中有一个主设备及最多达255台从设备。工业上一般使用modbus RTU模式,以16进制传送数据,一个字节就是一帧,效率高于modbus ASCII模式。一个典型的modbus协议数据包由若干帧组成,如图3所示:
图3 modbus数据包格式
其中,第1帧为从机地址,第2帧为功能码,第3、4帧为主机欲访问的从机的起始寄存器地址,第5、6帧为要访问的寄存器个数,最后两帧为16位CRC校验码。对任何一个 ModBus协议数据包,其第 1、2帧及最后两帧的意义都是相同的,其他帧则根据功能码不同而有所区别。
英创提供的libmbusmaster.a库实现了modbus协议,支持常用功能码,详细介绍请查阅网站文章《ModBus通讯协议软件包》、《英创嵌入式Linux工控主板支持Modbus主控协议软件》、《Linux下的Modbus设备方协议软件介绍》。
下面就linux系统下,使用英创提供的libmbusmaster.a库文件进行模拟电流采集应用编程作简单介绍,更详细的过程请参考具体例程。
1、打开串口设备
sprintf( hostName, “ttyS3:9600-8-1-0”);
hPort = mbusMaster_OpenPortProtocol( hostName );
2、设置modbus通信超时时间
i1 = mbusMaster_SetTimeout( hPort, 2000 );
printf( “SetTimeout:%dn”, i1 );
3、读取亚当模块转换结果寄存器,处理读取值
result = mbusMaster_ReadMultipleRegisters( hPort, moduleAddr, startAddr+channelStart,dataArr,channelCnt);
if (result == 0)
{
sampleCnt++;
printf(“*****sample %d*****n”,sampleCnt);
for (i1 = 0; i1 《 channelCnt; i1++)
{
value[i1] = CalculateCircuit(moduleID, dataArr[i1]);
printf(“[%d]:t%hdt0x%04xt%0.4fn”, i1 , dataArr[i1], dataArr[i1], value[i1]);
}
}
else
{
strcpy( str,mbusMaster_GetErrorText( result ) );
i1 = strlen( str );
if( i1》0 )
{
printf( “%s!n”, str );
}
}
其中,CalculateCircuit是根据不同模块的转换公式将读到的数值转换成对应的电流值。在使用mbusMaster_ReadMultipleRegisters读取寄存器值时,要参照各模块的手册,传递不同的寄存器映射地址。如果读取失败,可以通过mbusMaster_GetErrorText函数提示失败原因。
4、关闭串口设备
mbusMaster_ClosePortProtocol( hPort ); 如果用户对4~20mA模拟电流采集应用方案感兴趣,可以联系我们。我们将提供表1所有的模块信息及程序示例。
三、总结
目前,市面上亚当模块(模拟数采模块)在价格、性能、通道数上有非常灵活的选择,单通道的亚当模块最低不到¥100元就能买到。综合我们的测试情况来看,主控部分使用英创主板,模拟数据采集部分使用市面上成熟的亚当模块,是工业上一种快速构建4~20mA模拟电流采集硬件平台的方案,并且具有很高的灵活性,能够满足用户的不同需求。此外,英创的libmbusmaster.a库文件实现了modbus协议的常用功能,用户只要简单的调用几个函数,就能完成软件上的编写,大大减少了整个产品的开发周期,降低了开发难度。因此,此方案具有简单、高效、灵活、低成本的优势。
举报