
多串口多协议通讯卡XP248(基本说明XP248多串口多协议通讯卡(亦称网关卡是DCS系统与其它智能设备(如PLC、变频器、称重仪表等互连的网间连接设备,是SCnetⅡ网络节点之一,在SCnetⅡ网络......
多串口多协议通讯卡XP248(基本说明
XP248多串口多协议通讯卡(亦称网关卡是DCS系统与其它智能设备(如PLC、变频器、称重仪表等互连的网间连接设备,是SCnetⅡ网络节点之一,在SCnetⅡ网络中处于与主控制卡同等的地位。其功能是将用户智能系统的数据通过通讯的方式连入DCS系统中,通过SCnetⅡ网络实现数据在DCS系统中的共享。
1.1性能说明
¾XP248支持Modbus协议、HostLink协议以及自定义通讯协议。支持Modbus协议的主机模式和从机模式。通过SCControl功能块实现通讯组态。
¾XP248通讯卡支持4路串口的并发工作,每路串口支持RS-232和RS-485两种通讯方式。4个串口可同时运行不同的协议。每一串口可以挂接的设备数量由运行的协议决定,但最多不超过32个。
¾XP248具备通道冗余功能及卡件冗余功能,四路串口中COM0-COM1,COM2-COM3可以配置为互为冗余的串行通道,并可配合卡件冗余功能实现多种冗余方案。
¾通讯波特率支持(1200~19200bps,数据位(5~8位,停止位(1~2位,校验方式:无校验、偶校验、奇校验、空格校验、标志校验。
¾安装方式:按I/O卡件安装方式安装于机柜的机笼中,占用两个I/O槽位;
¾接线方式:接线端子;
¾输入电压:(5.0~5.8V;功耗:5W;
¾供电方式:机柜内5V供电。
¾SCnetⅡ通讯:100M以太网通讯,冗余配置(SCnetⅡA,SCnetⅡB。支持与操作员站、服务器的数据交互以及与ScnetⅡ网络其他控制站(IP地址范围2~62的站间数据交互。
1.2网络结构
图1-1XP248网络结构2硬件使用说明
2.1结构简图
XP248卡件的外观如下图所示(尺寸:187mm×145mm:
图2-1XP248底板结构图¾SW1:卡件地址拨码开关;
¾J3:掉电保护跳线。插上短路块,选择掉电保护功能。
¾BAT2:备用电池,型号CR2032。
图2-2XP248背板结构图
2.2面板指示灯说明
如图2-1所示XP248卡件具有7个LED指示灯,各指示灯说明如下表所示。
表2-1面板指示灯列表
LED指示灯常灭闪烁常亮
FAIL(红故障指示正常单网故障无组态;无监控;网络交错或全断
RUN(绿主CPU运行指示灯主CPU运行故障主CPU运行正常—
WORK(绿工作卡状态指示灯此卡为备用卡—此卡为工作卡STDBY(绿备用卡状态指示灯此卡为工作卡—此卡为备用卡LED-A(绿网络通讯指示灯
LED-B(绿网络通讯指示灯
网络已断开网络已连接—
SLAVE(绿通讯CPU运行指示灯通讯CPU运行故障通讯CPU运行正常—
2.3网络连接
在XP248的面板上有两个互为冗余的SCnetⅡ网络端口,分别为SCnetⅡA和SCnetⅡB:SCnetⅡA:SCnetⅡ通讯端口A,与冗余网络SCnetⅡ的A网络相连;
2.4地址跳线
如图2-1所示,XP248底板下方SW1为拨码地址开关,对应卡件在SCnetⅡ网络中的地址。在JX-300XP系统中,本卡件拨码地址范围为2~63,即拨码1和2应设置为OFF状态,拨码开关状态与地址对应关系如下表所示。冗余配置时,互为冗余的两块卡件拨码地址应为2n和2n+1(n为1~31的整数;单卡工作时拨码地址应为2n。
表2-2拨码地址列表拨码开关SW1地址
………………………………………………
图2-3拨码地址开关
2.5掉电保护
XP248具有掉电保护功能,可通过底板右上角掉电保护功能选择跳线J3,如图2-1所示,来选择是否启用该功能。
使用掉电保护功能应确保如下几点:
1、BAT2电池座内已安装纽扣电池,电池型号为CR2032、3V、220mAh的锂电池。
2、功能选择跳线J3处已插上短路块。
2.5.1电池装卸说明
电池安装
1、戴上防静电手腕;
2、取出XP248卡,平放在桌面上;
3、将锂电池正极朝上放入到电池槽中;
4、用螺丝刀按压电池上方,使电池被电池槽中的卡口卡牢。
电池拆卸
1、戴上防静电手腕;
2、取出XP248卡,平放在桌面上;
3、用螺丝刀朝外拨动电池槽左边的卡口簧片,直到锂电池从电池槽中弹起;
4、取出锂电池。
2.6通讯方式跳线
XP248卡件每个通道都支持RS-232及RS-485通讯方式,如图2-2所示,背板上有4个通讯方式跳线,可以对通讯方式进行选择。跳线方式与通讯方式对应关系如下图所示。
图2-4通讯方式选择跳线举例:第1、2路为RS-232通讯方式,第3、4路为RS-485通讯方式
2.7卡件安装
XP248卡件安装于机笼中,占用相邻的两个I/O槽位(槽位号为2n,2n+1;n为0~7的整数。2.8冗余方式
XP248卡件配合XP526端子板使用,支持通道冗余和卡件冗余,因此可以实现多种冗余方案。以下列举其中三种冗余方式,具体接线方法见《XP526使用手册》。
单卡通道冗余:
XP248卡件的COM0与COM1通道、COM2与COM3通道可配置成互为冗余通道(配置方法见“组态配置”一节,冗余方式如图2-5所示。
图2-5单卡通道冗余
双卡冗余:
XP248卡件提供双卡冗余功能,在主控制卡组态界面将冗余功能选项勾选上即可,如图2-6所示。
图2-6设置双卡冗余功能
图2-7双卡冗余方式
双卡通道冗余
在如图2-5所示的单卡通道冗余基础上,按如图2-7所示方式配置双卡冗余,即可实现双卡通道冗余。
3组态配置
XP248通过SCControl图形化编程软件进行通讯组态。SCControl软件中已经集成了通讯设置功能块以及ModbusRTU功能块、HostLink功能块等。利用SCControl软件提供的数值或逻辑运算功能块,XP248可以根据需要将智能模块输出的数据实现复杂的转换。(不支持SCControl中的I/O功能块以及PID控制算法功能块。
XP248组态主要由几个部分:
首先是SCnet组态。由于XP248与主控制卡都挂接在SCnetⅡ网络上,所以也占用SCnetⅡ网络的IP地址。XP248的组态方法与主控制卡相同,设置IP地址(拨码、控制周期默认为500ms。卡件冗余方式由用户选择。
其次是自定义位号组态。从下挂设备读出或要写入下挂设备的数据都存放在自定义位号中,XP248通过这些自定义位号与控制系统的操作员站/服务器进行数据交互。
最后是通讯组态。通讯组态也分为三个部分,一是对串口的通讯参数组态,包括波特率、校验方式等;二是命令组态,包括具体的Modbus通讯协议,例如读线圈、写寄存器等;三是读数或置数模块,将命令执行后的数据读到自定义位号或将自定义位号的数据写到命令的数据缓冲区。该部
分组态必须按照先组串口,然后组命令,最后组取数或置数模块的顺序进行。请注意,串口设置以及通讯命令设置模块的输入引脚只在组态时有效,在运行时不可改变,具体请参考模块的相关说明。另外,如果从智能设备取得的数据需要再进行处理,可以直接在SCControl软件中利用各种丰富的功能函数进行再次计算。
为方便现场调试,SCControl软件还提供了串口和命令诊断函数进行通讯诊断,通过这些功能块可以在SCControl软件的调试环境中,获取串口的收、发次数,命令的收、发次数,命令的通讯质量码等信息。
以下两节为SCControl软件内置的XP248功能块说明以及文中可能涉及的名词解释。
3.1名词解释
¾AltTim
命令间隔时间,串口设置模块中包含该参数,表示两条命令之间需要插入的等待时间。某些PLC或智能设备不允许在执行完一条命令后紧接着执行下一条命令,需要等待一段时间后才能响应。兼顾一般情况,可以将该参数设置为10ms。设置时间过长将使得命令执行周期加大。
¾Cycle
命令执行周期,命令置模块中包含该参数,表示该命令是否被周期执行以及执行周期为多长。只有周期地执行通讯命令,才能将智能设备中的数据读入到XP248卡。Cycle的单位是ms。
读智能设备数据命令。XP248卡按照设置的Cycle时间周期性地执行命令,当Cycle等于0时,表示该命令不是周期命令,只在组态启动时执行一次。所以一般情况下,该值可以设置为与XP248卡的控制周期相同。对于某些采样时间没有严格要求的数据命令,放大Cycle时间,可以在通讯量比较大的场合下,提高其他命令的执行速度。
写读智能设备数据命令。有两种触发方式:一是数据有变化才写(更新写,二是定时写(即周期写。将Cycle设置为0则表示有变化才写;将Cycle设置为定时时间则表示定时写方式,但当发现需要下写的数据有更新时,XP248卡仍会立刻执行该条写命令;XP248卡启动时,自动地认为数据没有变化,避免在启动时将不需要的数据写到智能设备中。所以一般情况下,建议配置为更新写,即设置Cycle为0。
¾AckTim
命令超时时间,单位ms。设置为0时,XP248卡内部自动调整。XP248卡发送命令给智能设备后,某些智能设备并不会立刻回应,而需要等待一定时间后才回应。XP248卡发出命令后,会启动一个超时定时器,定时时间为AckTim,当规定时间到达仍没有收到智能设备的响应,则认为通讯超时,退出本次通讯,本次通讯错误。当用户将AckTim设置为0时,则XP248卡会在(0~200ms内自动调整。当用户将AckTim设置为非0时,按用户实际设置的数据设置从机的应答超时时间。一般情况下,可以设置为0,让XP248卡自动修正(为了保证不错过返回的数据,可以把AckTim数值设置得大一些。
3.2SCControl内置的XP248功能块说明
3.2.1GW_SETCOM功能块
功能块:GW_SETCOM
功能:串口通讯参数设置模块
输入:
ComId:BYTE(串口号0~3
Baud:DWORD(波特率
DataBit:BYTE(数据位5,6,7,8
StopBit:
BYTE
(停止位1,2
Verify:BYTE(0:无校验;1:偶校验;2:奇校验;3:SPACE空格;4:MARK标志
AltTim:WORD(两条命令之间的间隔时间,单位ms,当该串口用于从机模式时,该值应该置为0。
Duplex:BOOL(OFF:非冗余通道ON:冗余通道
输出:Link:BYTE(用于后续链接,是ComId的复制
注意:功能块引脚输入在运行时不能改变。(奇校验和偶校验位跟在一个字节之后,说明一个字节信息的特性;具体传输时,先从低到高位传信息字节,再传校验位
3.2.2GW_MODBUS_RTU功能块
功能块:
GW_MODBUS_RTU
功能:MODBUS_RTU主机模块
输入:
CmdId:BYTE(命令号0~255,要求每条命令不能重复。通道冗余情况下,占连续两个命令号,组态时只组偶数命令号
ComId:BYTE(串口号0~3
Cycle:WORD(执行周期,单位ms
AckTim:WORD(命令最大的超时时间,单位ms,一般取200ms
Slave:BYTE(Modbus从机地址
Func:BYTE(功能号,支持1,2,3,4,5,6,15,16号命令Modbus的命令
Start:WORD
(数据起始编号1~65535
Num:WORD
(该命令操作的寄存器或线圈等的个数,Modbus协议对位变量(线圈或输入状态,一次最多可以存取2040个;对16位寄存器,一次最多可以存取127个。具体应用的实际限制参见5.9节
输出:Link:BYTE(用于后续链接,是CmdId的复制
注意:功能块引脚输入在运行时不能改变。每一条命令的Comdld都对应一个缓存区,由此命令发出或收到的数据必然会在此缓存区内保留。串口作为主设备,其下挂设备的设备号就是Slave值。
3.2.3GW_MODBUS_SLAVE功能块
功能块:GW_MODBUS_SLA
VE
功能:MODBUS_SLAVE从机模块
输入:
CmdId:BYTE(命令号0~255,要求每条命令不能重复。通道冗余情况下,占连续两个命令号,组态时只组偶数命令号
ComId:BYTE(串口号0~3
Add:BYTE
(本机在串口总线的从机地址号
输出:Link:BYTE(用于后续链接,是CmdId的复制
注意:功能块引脚输入在运行时不能改变。Add值就是此串口作为从设备的设备号,从机模式的Add要与主机方的Slave值一致。
3.2.4GW_HOSTLINK功能块
功能块:
GW_HOSTLINK
功能:欧姆龙PLC的HOSTLINK命令模块(主机模式
输入参数:
CmdId:BYTE(命令号0~255,要求每条命令不能重复。通道冗余情况下,占连续两个命令号,组态时只组偶数命令号
ComId:BYTE(串口号0~3
Cycle:
WORD
(执行周期,单位ms,等于0时为非周期命令,只执行一次AckTim:WORD(命令最大的超时时间,单位ms,一般取200ms
WoR:BYTE
(1:从PLC中读数据;128:向PLC写数据
Slave:BYTE(HOSTLINK从机地址
DataType:BYTE(存取的PLC数据类型,相当于功能号
测试命令:0可读,WORD(0:不通过;1:通过IR寄存器:1可读可写,WORD
HR寄存器:2可读可写,WORD
AR寄存器:3可读可写,WORD
LR寄存器:4可读可写,WORD
TC状态:5可读可写,BOOL,(ON=0xFF,OFF=0x00DM数据:6可读可写,WORD
ERROR错误信息:7可读,WORD
STATUS信息:8可读可写,WORD
TC数据:9可读可写,WORD
取消强迫命令:10需要用ST_STARTCMD手动触发执行
设置强迫命令:128+(IR或HR、AR、LR只写,
BOOL,ON=0xFF,OFF=0x00
StartWord:WORD(起始WORD号
BitOfWord:BYTE(WORD中位标号0~15,用于Forcedset/reste命令
WordNum:BYTE(需要操作的Word数量
输出:Link:BYTE(用于后续链接,是CmdId的复制
HOSTLINK协议支持对IR/HR/AR/LR寄存器的读写;支持对TC的状态读写和计数值读写;支持强迫和取消强迫命令。DataType引脚设置需要读写的数据类型,WoR引脚设置为1表示读,WoR设置为128表示写,例如,当DataType为1,WoR为1表示读IR寄存器。
对于FORCEDCANCEL取消强迫命令,需要用手动方式触发,即组态好一条命令后,用GW_STARTCMD(命令号函数手动触发,上位机可以用变量控制该函数是否执行。
注意:功能块引脚输入在运行时不能改变。hostlink功能块传输的数据为ASCII码,不是十六进制数。
3.2.5GW_GETCOMINFO功能块
功能块:
GW_GETCOMINFO
功能:获取串口诊断数据
输入:
ComId:BYTE(串口号0~3
输出:
SndCnt:WORD(发送次数
RcvCnt:WORD(接收次数
SndBuf:ULONG(发送缓冲区地址
RcvBuf:ULONG(接收缓冲区地址
3.2.6GW_GETCMDINFO功能块
功能块:
GW_GETCMDINFO
功能:获取命令诊断数据
输入:
CmdId:BYTE(命令号0~255
输出:
DataQuality:BYTE
(数据质量码1:正常0:异常
FailCnt:
BYTE
(通讯连续失败次数
NormalCnt:
BYTE
(通讯连续成功次数
SndCnt:
BYTE
(发送次数
RcvCnt:BYTE
(接收次数
当连续通讯三次都出现故障的情况(FailCnt=3,数据质量码DataQuality置0,表示数据失效(当前数据是三次通讯前的某次正确数据,当连续三次通讯正常(NormalCnt=3,数据质量码DataQuality置1,表示数据有效。
特别地,当该串口配置为冗余串口时,即便此时该命令在这个串口执行错误(FailCnt=3,只要该命令在另一个冗余串口能正常通讯,则数据质量码仍置1,表示当前该命令的数据有效。3.2.7GW_GETBYTE功能块
功能块:
GW_GETBYTE
功能:从命令的数据缓冲区读指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲读取数据在命令的数据块中的BYTE类型顺序(从0开始输出:
Data:BYTE(读出数据
3.2.8GW_GETBOOL功能块
功能块:
GW_GETBOOL
功能:从命令的数据缓冲区读指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲读取数据在命令的数据块中的BOOL类型顺序(从0开始输出:
Data:BOOL(读出数据
3.2.9GW_GETUINT功能块
功能块:
GW_GETUINT
功能:从命令的数据缓冲区读指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲读取数据在命令的数据块中的UINT类型顺序(从0开始输出:
Data:UINT(读出数据
3.2.10GW_GETULONG功能块
功能块:
GW_GETULONG
功能:从命令的数据缓冲区读指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲读取数据在命令的数据块中的ULONG类型顺序(从0开始输出:
Data:ULONG(读出数据
3.2.11GW_GETFLOAT功能块
功能块:
GW_GETFLOAT
功能:从命令的数据缓冲区读指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲读取数据在命令的数据块中的FLOAT类型顺序(从0开始输出:
Data:FLOAT(读出数据
3.2.12GW_GETMORE功能块
功能块:
GW_GETMORE
功能:将命令数据缓冲区中一批数据连续写到自定义变量区域,方便操作。
输入:
CmdId:BYTE(命令号
Serial:WORD(数据在命令数据缓冲区块中的顺序(从0开始
DataType:BYTE(自定义变量类型:1:自定义1字节2:自定义2字节
4:自定义4字节8:自定义8字节
VarId:UNIT(自定义变量ID号
Num:UNIT(连续存取个数
输出:无
3.2.13GW_SETBYTE功能块
功能块:GW_SETBYTE
功能:设置命令的数据缓冲区中指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲设置数据在命令的数据块中的字节类型顺序(从0开始Data:BYTE(欲设置数据
输出:无
3.2.14GW_SETBOOL功能块
功能块:
GW_SETBOOL
功能:设置命令的数据缓冲区中指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲设置数据在命令的数据块中的BOOL类型顺序(从0开始Data:BOOL(欲设置数据
输出:无
3.2.15GW_SETUINT功能块
功能块:
GW_SETUINT
功能:设置命令的数据缓冲区中指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲设置数据在命令的数据块中的UINT类型顺序(从0开始Data:UINT(欲设置数据
输出:无
3.2.16GW_SETULONG功能块
功能块:
GW_SETULONG
功能:设置命令的数据缓冲区中指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲设置数据在命令的数据块中的ULONG类型顺序(从0开始Data:ULONG(欲设置数据
输出:无
3.2.17GW_SETFLOAT功能块
功能块:
GW_SETFLOAT
功能:设置命令的数据缓冲区中指定数据
输入:
CmdId:BYTE(命令号0~255
Serial:WORD(欲设置数据在命令的数据块中的FLOAT类型顺序(从0开始Data:FLOAT(欲设置数据
输出:无
3.2.18GW_SETMORE功能块
功能块:
GW_SETMORE
功能:将自定义变量区域中一批数据写到命令数据缓冲区
输入:
CmdId:BYTE(命令号
Serial:WORD(数据在命令数据缓冲区块中的顺序(从0开始
DataType:BYTE(自定义变量类型:1:自定义1字节2:自定义2字节
4:自定义4字节8:自定义8字节
VarId:UNIT(自定义变量ID号
Num:UNIT(连续存取个数
输出:无
3.2.19GW_SNDMSG功能块
功能块:
GW_SNDMSG
功能:串口发送命令。将SndBuf指定的发送缓冲区地址和SndLen长度数据发送出去。
输入:
CmdId:BYTE(命令号0~255
ComId:BYTE(串口号0~3
SndBuf:
ULONG(发送缓冲区指针,一般由GW_DEFSNDBUF(UINTSize定义函数定义
SndLen:UINT
(发送长度
输出:Link:BYTE(用于后续链接,是CmdId的复制
3.2.20GW_RCVMSG功能块
功能块:
GW_RCVMSG
功能:串口接收命令。将收到的一帧数据存放到RcvBuf指定的缓冲区地址。
输入:
CmdId:BYTE(命令号0~255
ComId:BYTE(串口号0~3
RcvBuf:ULONG
(接收缓冲区指针,一般由GW_DEFRCVBUF(UINTSize定义函数定义
输出:Link:BYTE(用于后续链接,是CmdId的复制
注意:功能块引脚输入在运行时不能改变。
3.2.21GW_SNDRCV功能块
功能块:GW_SNDRCV
功能:实现串口的发送和接收功能。首先将SndBuf缓冲区的数据发送出去后,然后将接收到的数据存放到RcvBuf缓冲区。
输入:
CmdId:BYTE(命令号0~255,要求每条命令不能重复。通道冗余情况下,占连续两个命令号,组态时只组偶数命令号
ComId:BYTE(串口号0~3
Cycle:
UINT
(执行周期,单位ms,等于0时为非周期命令,只执行一次
AckTim:UINT(命令最大的超时时间,单位ms,一般取100ms
SndBuf:ULONG(发送缓冲区指针
SndLen:UINT(发送长度
RcvBuf:ULONG
(接收缓冲区指针
输出:Link:BYTE(用于后续链接,是CmdId的复制
注意:功能块引脚输入在运行时不能改变。
4自定义协议编程
XP248提供标准的通讯协议,例如ModbusRTU、HostLink等,基本可以支持大部分的通讯应用,但是对于某些采用了非标准通讯协议的特殊设备,则需要利用SCControl软件提供的ST语言对XP248进行通讯协议编程,以适应设备的通讯协议。
XP248提供了GW_SNDMSG(、GW_RCVMSG(、GW_SNDRCV(三个功能块实现串口的发送、接收、发送/接收功能。这些通讯功能块的基本作用是将指定的数据串发送出去,并接收来自智能设备的返回数据串。数据串的具体内容由用户在ST语言中进行读写。
发送和接收的数据串需要存储在数组中,由于XP248的通讯组态是在SCControl软件中进行,而SCControl功能块的引脚不支持数组作为参数输入。所以XP248提供了GW_DEFSNDBUF(Size、GW_DEFRCVBUF(Size两个函数为每条命令定义发送和接收缓冲区,缓冲区大小由Size决定。缓冲区一旦创建后将不能被修改,除非再次下载组态。两个函数返回一个ULONG类型的数据用来指向创建的缓冲区,称为缓冲区指针。
XP248提供GW_WRITEBUF(MsgBuf,Serial,Char和GW_READBUF(MsgBuf,Serial两个函数用来对创建的缓冲区进行读或写操作。其中,MsgBuf为缓冲区的指针,Serial是缓冲区中的数据位置,对缓冲区的读写操作不会越过缓冲区边界。
GW_SNDMSG(、GW_RCVMSG(和GW_SNDRCV(三个功能块其实与Modbus功能块类似,只是定义了一条通讯任务,具体的通讯操作并不在这些函数中实现,而是由XP248卡内部的调度程序完成。
XP248提供了GW_GETRCVLEN(CmdId函数用来获取接收到的数据长度;GW_GETRCVMSG(CmdId,MsgBuf函数将接收到的数据拷贝到MsgBuf指向的缓冲区。
此外,XP248提供一些辅助函数,例如:GW_CRC16(MsgBuf,Len对数据串进行CRC检验;GW_STARTCMD(CmdId函数强制执行一条命令;GW_FIRSTRUN(判断XP248卡当前是否是启动组态后的第一次运行。
自定义协议目前暂不支持冗余。
下面是以上函数的详细说明:
/*********************************************************************
功能块:GW_DEFSNDBUF
描述:定义命令的发送缓冲区
输入:
Size:UINT(缓冲区大小,最大不超过1024
输出:ULONG(缓冲区指针
**********************************************************************/
ULONGGW_DEFSNDBUF(UINTSize
/*********************************************************************
功能块:GW_DEFRCVBUF
描述:定义命令的接收缓冲区
输入:
Size:UINT(缓冲区大小,最大不超过1024
输出:ULONG(缓冲区指针
**********************************************************************/
ULONGGW_DEFRCVBUF(UINTSize
/*********************************************************************
功能块:GW_WRITEBUF
描述:向缓冲区写入一个元素
输入:
MsgBuf:
ULONG
(缓冲区指针
Serial:UINT(写入位置
Char:BYTE(写入数据
输出:
无,(注:如果Serial越限,则放弃操作
**********************************************************************/
voidGW_WRITEBUF(ULONGMsgBuf,UINTSerial,BYTEChar
/*********************************************************************功能块:GW_READBUF
描述:从缓冲区读入一个元素
输入:
MsgBuf:
ULONG
(缓冲区指针
Serial:UINT
(写入位置
输出:
BYTE(返回数组内指定位置数据,如果Serial越限,则返回0**********************************************************************/BYTEGW_READBUF(ULONGMsgBuf,UINTSerial
/*********************************************************************功能块:GW_ISCMDFINSHED
功能:判断命令是否执行完毕
输入:
CmdId:
BYTE
(命令号0~255
输出:BYTE
0:正在执行
1:正常结束
2:异常结束
**********************************************************************/BYTEGW_ISCMDFINSHED(BYTECmdId
/*********************************************************************功能块:GW_GETRCVLEN
功能:取得接收长度
输入:
CmdId:BYTE(命令号0~255
输出:UINT(返回接收到信息的长度
**********************************************************************/UINTGW_GETRCVLEN(BYTECmdId
/*********************************************************************
功能块:GW_GETRCVMSG
描述:拷贝接收到的数据到指定缓冲区
输入:
CmdId:BYTE(命令号0~255
输出:ULONG(接收数据区指针
**********************************************************************/ULONGGW_GETRCVMSG(BYTECmdId
/********************************************************************功能块:GW_CRC16
描述:对缓冲区中指定长度元素进行CRC检验
输入:
MsgBuf:
ULONG
(缓冲区指针
Len:WORD(指定长度
输出:WORD(16位的CRC校验
*********************************************************************/WORDGW_CRC16(ULONGMsgBuf,WORDLen
/*********************************************************************功能块:GW_STARTCMD
功能:手动启动命令执行
输入:
CmdId:BYTE(命令号0~255
输出:无
**********************************************************************/voidGW_STARTCMD(BYTECmdId
/********************************************************************功能块:GW_FIRSTRUN
描述:判断是否首次运行
输入:
Any
:BYTE任何数
输出:BYTE(0:非首次运行,1:首次运行
*********************************************************************/BYTEGW_FIRSTRUN(BYTEAny
5工程应用说明举例
5.1XP248与SCnetⅡ网络接口
XP248通讯卡向上挂接在SCnetⅡ网络上,占用控制站地址,可以用SCKey组态软件对通讯卡进行组态和下载,操作方法和内部机制与JX-300XP系列主控制卡相同,支持两块XP248的冗余配置。网络地址的设置同主控制卡,拨号范围2~63,但地址不能与系统中的主控制卡冲突。
5.2通信协议
XP248卡支持标准的ModbusRTU协议(主机或从机模式以及HostLink协议(主机模式,其他的通讯协议可以用自定义协议解决。
5.3数据采集周期
XP248通信周期(智能设备的循环采样的周期与它所连接的智能设备数量、通信波特率、通信数据量、智能设备的特性、通信协议等都密切相关。其数据采集周期最短为2ms。
5.4命令执行时间以及Cycle设置说明
一般情况下,可以将命令的Cycle设置为与XP248组态时的控制周期一致。确定控制周期的依据主要是通讯量以及通讯速率,以下进行简单的说明。
一条命令的执行时间Tcmd=T1(命令发送时间+T2(智能设备响应时间+T3(智能设备数据回送时间。
T1:以9600bps,1位停止位,1位起始位,数据位8位为例,收发1个字节的时间约为1ms。Modbus命令的帧头根据不同的命令具有不同的长度,但一般可以计算为6个字节,再加上CRC检验,共8个字节。因此,命令发送时间至少为8ms。
T2:智能设备的响应时间,表示自命令发出后,智能设备开始发送回应数据的时间。不同的设备有不同的相应时间,一般取50ms计算。
T3:智能设备数据回送时间。回应的数据帧长度也按8个字节计算。Modbus的线圈占1位,8个bit合成一个字节,超过部分也占用1个字节;Modbus的寄存器占2个字节。对线圈、状态等按Bit操作的命令,占用时间=8+(n/8+1(ms,其中n为线圈或状态的个数。寄存器由于占2个字节,所以命令占用时间=8+2*n(ms,其中n为寄存器个数。注意,以上估计均以波特率为9600bps计算。
XP248有4路串口,每路串口都可以接若干设备,对一个设备也可以有多条命令进行操作。XP248的4路串口可以同时工作,但同一路串口下命令必须逐条执行。因此,对一路串口来说,所有命令都执行一遍的时间为:
Tc(所有命令执行时间=Tcmd1+Tcmd2+….+Tcmdn+n*Talt
其中,Tcmd1为命令1的执行时间,Tcmdn为第n条命令的执行时间,Talt是设置的两条命令间隔时间AltTim。Tc则是该串口所有命令执行一遍的最小时间。
因此,设置命令的执行周期Cycle时,必须大于以上计算的Tc。如果设置的Cycle时间小于实
际运行时间Tc,那么,XP248卡将以最短的Tc时间运行,每条命令的周期则被自动拉长,但所有通讯仍会被执行且运行正常,只不过每条命令的实际周期执行时间要比设置的大一些。因此,虽然Cycle设置过小不会引起XP248卡工作异常,但是此时的Cycle已经失真,故设置Cycle时需要考虑命令的执行时间。
当Cycle设置为0时,命令不是周期命令,不会被周期执行。如果是读命令,则只在启动组态后执行一次;如果是写命令,则需要在数据有变化后才触发命令执行。
5.5单块XP248可连接设备数量
XP248在RS-485方式下,每个串口最多可以驱动32台设备。但实际连入设备时,还需考虑数据通讯量和数据刷新时间(命令执行周期,设置合适的命令周期,如果实际的命令周期不能满足需要,则需要减少挂接的设备,或将设备移到其他串口。
因此,与多台智能设备相连时,每路串口配置的智能设备数量受以下两方面影响:(1通讯数据量:数据量越大,所带的智能设备越少。(2数据刷新时间:数据刷新时间即命令的执行周期Cycle,要求的刷新时间越短,在其它条件相同的情况下所带的智能设备数量就会越少。
5.6使用Modbus进行通讯的组态示例
XP248的组态基本上分为三个步骤,首先是用GW_SETCOM功能块对所有使用串口进行组态,然后组态通讯命令,最后用取数模块(如GW_GETBOOL或置数模块(如GW_SETBOOL将自定义位号与命令关联。
对于命令较多的组态,可以将一个串口所有组态(包括串口参数组态、命令组态安排在一个FBD段落中,每个串口一个段落,增强可读性。下面是一个具体的例子。
COM0组态为不冗余方式,波特率9600bps,1位停止位,8位数据位,无检验。
串口COM0下的0号命令,读1#PLC中从00001开始的16个触点状态,并将00003号触点状态写到自定义变量BOOL1中。所有命令的AckTim响应超时时间设为0,表示由XP248卡自动设置。2号命令则读10001号线圈到自定义1字节位号BOOL2,由于Cycle设置为0,故只在组态启动后运行一次。4号命令将BOOL3写到PLC的10001号线圈,由于Cycle设置为0,故只有在BOOL3变化后才将数据写到PLC。
图5-1使用Modbus进行通讯的组态示例
5.7运行调试
组态经过编译下载后,可以利用SCControl软件的调试功能进行在线调试。工程组态中,对0号命令(CmdId=0利用GW_GETCMDINFO功能块进行了诊断。调试变量画面显示了调试数据,其中BYTE6是诊断命令的命令号,BYTE1是该命令的数据质量码,0表示通讯故障数据失效,1表示通讯正常。BYTE2是通讯连续错误次数,BYTE3是通讯连续正常次数,BYTE4、BYTE5分别表示该命令发送了几次,收到了几次回应。
通过以上数据的实时变化,可以判断通讯的情况。如果SndCnt发送次数在不断累加,则说明该命令被不断执行,如果此时RcvCnt没有变化,说明命令发出后没有收到回应。如果RcvCnt和FailCnt不断累加则说明虽然能收到数据,但收到的是错误的回应数据或命令不能被正常执行,此时,需要检查组态是否正确。当NormalCnt开始累加到3次以后,表明已经连续3次通讯正常,此时的数据质量码DataQuality变为1,表示数据有效。
实际应用时,GW_GETCOMINFO的引脚ComId和GW_GETCMDINFO的引脚CmdId可以用一个自定义变量代替,当在线调试时,可以修改变量的值使之指向不同的串口或命令,方便各串口或命令的调试,整个项目只需要各用一个GW_GETCOMINFO和GW_GETCMDINFO功能块。需要获取命令的质量码时可以用GW_GETCMDINFO的DataQuality引脚获取,可以将数据和质量码通过SCnetⅡ网络传播到网络其他节点,用于其他高级应用。
5.8编写自定义协议
以下是用ST语言编写程序的方法实现Modbus协议中的读线寄存器命令。
编写自定义协议,一般分为两步:
第一步:编写ST段落,该段落先用GW_DEFSNDBUF和GW_DEFRCVBUF函数定义发送和接收缓冲区(由于缓冲区大小一旦定义完后不能被改变,所以缓冲区应该大小合适,既要适合最大通讯长度又要避免不必要的浪费。缓冲区定义完后,可以用GW_WRITEBUF函数写入需要发送的命令数据,利用GW_CRC函数对输入的数据进行CRC检验,并把校验后的数据写到发送数据的末尾。
将该ST段落的输出管脚(发送缓冲区指针、接收缓冲区指针、发送长度连接到GW_SNDRCV功能块的输入引脚。
第二步:编写ST段落,用GW_GETRCVLEN函数检测串口是否有接收到数据,如果有,则用GW_GETRCVMSG函数将接收到的数据拷贝到接收数据缓冲区RcvBuf。然后对接收缓冲区中的数据进行解析。此处是先用GW_CRC功能块进行校验,如果校验正确,则逐个读出缓冲区数据并作为模块的输出。该段落的输出是一个2字节模拟量。
图5-2自定义协议的编写示例
以下是ST段落GW_CMD1_SETMSG的代码:
XP248()使用手册先按照Modbus的数据结构,安排每个字节的内容。进行CRC校验,再把数据发到缓冲区。Modbusslave是将计算机模拟成PLC,按照Modbus协议的格式解析数据。此模块中,模仿它的格式,替代Modbus_RTU模块。以下是ST段落ST_CMD1_GETMSG的代码:26
XP248()使用手册读出缓冲区的数据,进行CRC校验。若正确,则输出值OUT1。若没有这个模块,不影响发送和接受数据自定义协议是针对非标准协议而言,是设备方遵守的特定协议。我们是根据其协议格式组模块,即第几个字节写什么,具体“什么”的含义由设备方所遵守的协议制定。设备对数据进行解析,用自身所带的协议的格式,而不管数据的内容。5.9应用注意事项在使用功能块GW_MODBUS_RTU时Num的最大值如下表所示:命令号最大值(个)125522553127412751611525516123在使用功能块GW_MODBUS_SLAVE时,本卡件对主机模块协议能响应的读取数据的最大值如下表所示:27
XP248()使用手册命令号最大值(个)1200022000312541255161XP248()版本卡件须配套软件(含)以上版本使用。6资料版本说明表6-1版本升级更改一览表资料版本号XP248使用手册()XP248使用手册()输出时间2008-11-172009-5-25更改说明适用模块版本:重新排版与修订28