基于研华PCI_1680 的裁床专用通讯协议的实现
2015-08-26陈波,熊金
陈 波, 熊 金
(绵阳市维博电子有限责任公司 四川 绵阳 621000)
数控大型服装裁剪机(以下简称裁床系统)是服装CAM设备中的高端产品,此设备的主要优点是:服装生产自动化程度高,裁剪速度快,生产周期缩短,布料利用率高,节约成本,裁剪衣片质量好,不会受人为因素影响。 尽管我国服装产业凭借产量和规模创造出骄人的业绩,但产业发展面临的问题也不容忽视。 与发达国家相比,我国服装生产信息化、自动化水平非常低。 以计算机、网络、先进制造等为代表的先进技术,在发达国家服装业已广泛用于生产自动化、信息采集传递、产品设计、生产管理、电子商务等环节。 目前,在工业控制系统中,CAN 总线在完成现场的控制器、 执行器等底层设备间的数据通信方面正发挥着巨大的作用。
CAN 作为现场设备级的通信总线, 和其他总线相比,具有很高的可靠性和性价比。 CAN 接口芯片的生产厂家众多,协议开放,并且使用方便,由此看出CAN 总线将成为今后众多领域的发展方向。 由于裁床系统在运行过程中需要通信的数据通讯量大、通讯速度要求快,与一般的通讯总线相比,采用CAN 总线的进行数据通讯具有更突出的优点[1]。 基于上述原因本文主要应用VC 开发出供用户调用的动态链接库文件,以驱动研华CAN 卡PCI_1680,从而实现了工控机与CAN总线之间的数据传输, 然后通过CAN 总线连接上位机和下位机从站。
1 总体设计PCI_1680CAN 通讯卡简介
通信卡插在工控机的PCI 总线槽中,其整体结构可以分为3 个部分, 即CAN 总线接口部分、PCI 总线接口部分和通信控制部分。研华公司生产的PCI_1680 为CAN_PCI 转换卡,该卡支持CAN2. 0A 和CAN2. 0B 协议, 主要应用于微机与CAN 总线的数据交换。 其附带的动态链接库(DLL)封装了共享资源和代码,是一种基于Windows 的应用程序模块,它可以在程序运行时被装入和链接,使用DLL 封装技术大大节约了内存,提高了开发的效率[2-3]。研华PCI_1680 CAN 通信卡如图1 所示。
软件工具包中的CANbus2.0.h 已经声明了控制该卡进行CAN 数据收发的一些API 函数,用户只需调用函数即可实现对CAN 总 线 的 数 据 读 写 操 作。 将m_Port、m_DeviceNum、m_nBTR0、m_nBTR1 做为输入参数,其中,m_Port 是所打开CAN卡的端口号,m_DeviceNum 是所选设备编号,PCI- 1680 的波特率是由m_nBTR0 和m_nBTR1 两个参数确定的。PCI_1680通信卡软件包中的API 函数及其功能主要有以下一些:
图1 研华PCI_1680 CAN 通信卡Fig. 1 Yanhua PCI_680 communication card
打开CAN 通信端口
CANPortOpen(m_DeviceNum, m_ Port,hostID, Baudrate)
初始化CAN 端口
CANInit(m_ Port, m_nBTR0, m_nBTR1, IntMask)
设置输出控制寄存器
CANSetOutCtrl(m_ Port, m_nOutCtrlCode)
设置掩码寄存器
CANSetAcp(m_ Port, m_nAcpCode, m_nAcpMask)
设置CAN 通信协议类型
CANSetProtocolType(m_ Port, m_wProtocolType)
设置波特率大小
CANSetBaud(m_ Port, m_nBTR0, m_nBTR1)
设置端口为正常模式
CANSetNormal(m_ Port)
允许事件触发机制
CANEnableEvent(m_ Port, TRUE)
允许接收中断
CANEnableRxInt(m_ Port)
设置接收缓冲区
CANSetBufferPtr(m_ Port, TRUE)
等待CAN 总线上数据
CANWaitForFIFOEvent(m_ Port)
关闭CAN 通信端口
CANPortClose(m_ Port)
下面以CAN2.0A 为例介绍一下调用API 函数的流程。其中图2(a)为发送数据流程,图2(b)为接收数据流程。
图2 调用API 函数顺序流程图Fig. 2 Flow chart of transfer API function
2 裁床系统中PCI_1680CAN 通信模块的具体实现
一般来说,CAN 通信协议规定了4 种不同的帧格式:数据帧、远程帧、错误帧和超载帧。 其中数据帧用于携带数据从发送器至接收器;远程帧是由总线单元发出的,用于请求发送具有同一识别符的数据帧;任何单元检测到总线错误就发出错误帧;超载帧用以在先行的和后续的数据帧(或远程帧)之间提供附加的延时。 裁床系统的体系结构,决定了系统是以裁剪文件数据收发和工作模式管理为核心来工作的,这也决定了CAN 通信模块作为信息交换的主导地位, 在系统运行管理中起着非常重要的作用,同时也是提高系统工作安全性与可靠性的关键所在[4]。
使用PCI_1680 通信卡之前必须根据所使用的通信协议对CAN 端口进行初始化操作,包括打开CAN 端口、设置波特率大小、允许接收中断等操作;其次是进行CAN 数据交互操作,包括数据发送和数据接收;最后,在退出通信程序的时候关闭CAN 端口。 参数正确进行初始化操作,这可以通过工具包中的函数调用来实现。 当上述工作完成之后,可以通过下面2 个函数实现对CAN 总线的收发数据操作:
LRESULT FTYPE CANWriteFile(WORD Port,BOOL FAR*Ready, PVOID FAR SendBuf);
LRESULT FTYPE CANWaitForFIFOEvent (WORD Port,ULONG timeout, BOOL * bReady );
在CAN 通信模块中, 通信模块在每个通信周期内被调用一次。 因此,在模块中定义一个初始化标志位Init_sign,初始值为0(False),当初始化后把该位置为1(True),以保证在下一个周期内不会再次初始化变量, 而直接进行CAN 数据交互。 具体流程图如图3 所示。
图3 CAN 通信模块的具体实现流程图Fig. 3 Material flow chart of CAN communication module
CAN 参数初始化完毕后启动通信线程,首先由上位机向下位机发送复位命令,延时10ms 后再发送同步信号,然后根据裁床系统的工作模式及状态进行数据的交换。 根据初始化配置 CANWriteFile 往 CAN 总线上发送一帧数据,CANWaitForFIFOEvent 等待接收CAN 总线上发来的数据。具体的算法如下:
首先定义存储CAN 2. 0A 信息帧的数据结构如下:
typedef struct
{
UCHAR ff;
UCHAR rtr;
ULONG id;
UCHAR dlen;
UCHAR data[8];
} CAN_MSG_T_EX, *PCAN_MSG_T_EX;
每一个MSG 变量记录了CAN 的ID 号及8 字节的数据信息。由于CAN2. 0A 规定ID 为11 位,但是字符串中的每一个字符仅有8 位,因此应该将ID 分为两个字符来存储,数据帧信息ID 的长度为11 位,接收缓冲区可以定义成一个包含有1024 个MSG 变量的结构体数组ReceiveMSG [1024],同理, 发送缓冲区可以设计成SendMSG [1024]。 CAN 标识符对应的数据结构定义如下[6]:
typedef union
{
struct
{
//通信命令
unsigned __int16Command :5;
//工作模式切换要求:1--要求切换
unsigned __int16 WorkModeSwitch :1;
//帧标记:0--中间帧,1--结束帧
unsigned __int16 FrameFlag :1;
//目标地址
unsigned __int16 TargetAddr :2; //源地址
unsigned __int16 SourceAddr :2; //邮箱编号
unsigned __int16 MboxIV :5;
}bit;
unsigned __int16 all;
}CANCOMMAND;
当CAN 总线上检测到一帧新的数据之后, 先判断它的ID 号,然后把ID 号和数据信息存入到数组相应的位置。当要发送一帧信息时,我们只要将数组中对应的数值发送到总线上即可[7],比如上位机向下位机发送回裁床系统参考点的命令,我们只要从CANCOMMAND 中取出相应数值发到总线上。
//通信命令为回参考点
SendObj.id.bit.Command = CanCmd_Reference;
//数据类型为空
SendObj.id.bit.DataType = CanDataType_Empty;
//帧重复标记位0
SendObj.id.bit.RepeatFlag = 0;
//帧结束标记为1
SendObj.id.bit.FrameFlag = 1;
//数据长度为0
SendObj.dlen = 0;
3 裁床系统数据交换相关命令字及内容
3.1 裁床系统数据交换相关命令字
在本系统中, 考虑到上位机是基于Windows 操作系统,主要是以线程方式来完成数据的循环接收或发送;而下位机是基于DSP 的,可以方便的采用中断方式完成数据的发送和接收,所以本协议中的信息交换主要以下位机为主,由下位机主动向上位机发送数据信息;而上位机一般不主动发送连续的信息,主要以单个命令的方式主动向下位机发送,以完成简短的数据交换[4]。命令字(占报文ID 的D4~D0 位)主要包括以下内容:
#define FirstSynchronization 0x0001
#define GetSlaveVersion 0x0002
#define ForbidEchoplexData 0x0003
#define PermitEchoplexData 0x0004
#define ParaTransmit 0x0005
#define ACK 0x0006
#define ResponseCommand 0x0007
#define SlaveSoftwareUpdate 0x0008
#define RequestEchoplexSpecifcData 0x0009
#define SlaveEchoplexData 0x000a
#define AutoDataTransimit 0x000b
#define ExitSys 0x000c
3.2 裁床系统数据交换内容
裁床控制系统中,上下位机交换的内容主要包括以下几个方面:
1)上位机向下位机传递的命令字及命令参数;
2)上位机向下位机传递的参数信息;
3)下位机向上位机传递的坐标信息;
4)下位机向上位机传递的报警信息;
5)下位机向上位机传递的当前系统状态信息。
上、下位机的系统控制程序启动后,下位机DSP 的程序先于上位机的程序运行,且一直处于接收监听状态,在接到上位机允许回送数据的命令之前,禁止主动向上位机发送信息,除非上位机有对下位机回送指定信息的要求。 该命令是由上位机主动向下位机发起的, 只用在系统程序启动时,且只进行1 次。 通过该命令的执行,上下位机则完成通信链路的建立,完成正式通讯的同步[5]。
3.2.1 IPC 方的处理流程
以上位机向下位机传递参数为例,该命令属于上位机主动向下位机传递的控制命令。 该命令使用比较广泛,除了在首次同步完成且获得下位机版本号以后,首次完成所有参数向下位机的传递外,还可在中间完成实时修改的参数向下位机的传递。 上位机在发起该命令之前,必须保证下位机已经停止了主动向上位机回传数据的过程,即是说,上位机已经向下位机成功发送了“ForbidEchoplexData”的命令,获取了对通讯总线的控制权。
IPC 方按如下约定组织报文ID 和邮箱内容如表1 所示。
表1 IPC 方报文ID 和邮箱内容Tab. 1 IPC message ID and email content
注:
1)邮箱的第0、第1 个字节表示参数传递的子命令,与参数项相对应(具体编码参见前面的“ParaTransmit”子命令的定义部分),邮箱后续字节表示参数内容。
2)如果该项参数的内容超过6 个字节,则上位机需要继续发送后续帧, 但后续帧的内容则从邮箱的字节0 开始存放。 即后续帧中,不再有表示参数编号的内容;
3)上位机在设置本次帧传递长度时需要根据本次理论要传递的字节数设置;
4)在准备每一帧,上位机必须根据数据内容长度,正确设置标识符的D6 位;
5)上位机传递完一帧后,必须在得到下位机的ACK 回复后,才继续传递下一帧;上位机在超时检测后或收到下位机的NAK 应答,将自动退出本项参数的传递;
6)多项参数,均要求上位机重复上述步骤1)~5),不同参数项的编号需要上下位机事先约定好。
3.2.2 下位机DSP 的处理流程
DSP 在识别到参数传递的命令帧后,根据帧内容和帧状态,立即向IPC 回送ACK 应答帧,其格式如表2 所示。
表2 DSP 回送ACK 应答帧格式Tab. 2 The DSP echo ACK response frame format
而下位机每传送完一次, 必须在收到上位机的ACK 应答后,方可继续后续帧的传送。 如果一个完整的数据信息包传递完成,则帧结束标记应置为1。 由于裁料在裁剪过程中,上位机向下传递自动加工数据和下位机回送状态数据是在连续交叉进行的,必须控制好总线的争用。 一方面上位机可以在向下会机传递自动加工数据时,可以先禁止下位机回送状态信息,在自动加工数据传送到一定量时,再允许下位机回送状态数据;而下位机如果要回送状态,也可根据状态是否变化了来确定回送与否,且可以回送指定的数据,即下位机掌握回送内容的主动权。
4 结束语
CAN 总线是一种具有国际标准且性能价格比比较高的现场总线,在自动控制领域的发展中起着中要作用[7]。 本文首先根据裁床控制系统自身的特点, 采用了研华PCI_1680 CAN 通信卡进行数据的交互。 实践证明,该通信卡完全能满足通信要求,其附带的API 函数设计简单,且使用方便,实时性强, 具备一定的抗干扰能力, 达到了预定的设计目的。
[1] 赵君,刘卫国,谭博. 基于CAN总线的分布式多电机控制研究[J] .兵工自动化,2010,29(12):73-74.
[2] 魏长军,吴青,陈兴宝,等. 基于工具包的研华PCI_1680通讯卡OPC服务器软件的实现[J]. 河南理工大学学报,2008,27(4):437-439.
[3] 孟诏,杨建武,孙树文. 基于VC 供Labview 调用的CAN 卡驱动设计[J]. 微计算机信息,2008,24(9):177-179.
[4] 赵勇,黄大贵,吴献刚. 开放式数控裁床软件系统的研发[J].微计算机信息, 2009,25(2):163-165.
[5] 易军.基于CAN总线技术的一类智能节点开发及应用.监控技术,2003(7):31-35.
[6] 章富元,方江龙,汤季安. 我国数控技术发展的思考[J]. 中国机械工程,1999(10):1100-1103.
[7] 黄河. 高浪琴 基于CAN总线通讯智能节点的设计与实现[J].江西科学,2004:289-292.