1 软件需求
人机界面为MCGS 10寸触摸屏1062KW,接口为RS232/RS484/以太网,供电电源为24V。机触摸屏的功能为机器人的基本状态信息显示和对机器人的控制及参数给定。
目前设计的小车分成两栏共10格,需要将对应的触摸屏大致分成相应的10大格,会在工艺上规定每个格子只能放哪几类工件,然后在触屏上每个格子上给出相应的型号,下拉菜单或者缩略图等需要具体沟通,当来料小车停到位,工人在触屏上选好对应的工件,开启,触屏跟机器人控制柜通信,机器人控制柜控制碰焊机进行对应的碰焊作业。
采用RS232让触摸屏和贝加莱控制器通讯,通讯线缆距离大约为2米。控制信息包括:使能、启动、停止、急停、工件型号、槽位(1~10),数量,初始化(复位)。状态显示信息有机器人状态(就绪,使能,运行,暂停),故障信息,工序信息等。
2 通讯接口开发
2.1 硬件连接
触摸屏COM口RS485/RS232的通讯接口定义如下:
RS485 A+ | RS485B- | RS232 RX | RS232 TX | GND |
7 | 8 | 2 | 3 | 5 |
RS232需要将贝加莱控制器的RX连接触摸屏的3口,将控制器的TX连接至触摸屏2口,GND连接至触摸屏的5口。
2.2 通讯设备设置
RS232通讯设备采用通用串口父设备,子设备采用莫迪康ModbusRTU协议,添加以下设备窗口,如图2所示。
图2 添加通讯设备
通用串口父设备的属性为:
串口端口号:RS232对应的是0-COM1,1-COM2对应的是RS485通讯
通讯波特率:11 - 57600bps
数据位:1 - 8位
停止位:0 - 1位
数据校验位:0 – 无校验
莫迪康ModbusRTU设备的属性需要设置设备的地址,将从站地址设为1,该地址需要与控制器下面的地址相对应。
2.3 通讯协议定义
(1)读取寄存器(功能码:03)
触摸屏请求指令格式为:
字节 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
含义 | 1 | 03 | ADDRH | ADDRL | NUMH | NUML | CRCL | CRCH |
地址 | 功能码 | 待读取参数首地址 | 指令数(参数个数1~125) | CRC校验 |
控制器响应指令格式为:
字节 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ||
含义 | 1 | 03 | BYTECNT | DATAH | DATAL | DATAH | DATAL | CRCL | CRCH |
地址 | 功能码 | 响应字节数= 指令数*2 | DATA1 | DATA2 | CRC校验 |
例:触摸屏请求读取地址为101的参数的值,控制器返回值为5
触摸屏请求:1 3 0 100 0 1 CRC
控制器响应:1 03 02 00 05 CRC
要读取的状态信息依次为:机器人状态,故障信息
(2)写乘法寄存器(功能码 16)
触摸屏向控制器连续写入多个字节,客户端发送数据格式为:
字节 | 0 | 1 | 2~3 | 4~5 | 6 | 7~8 | …… | ||
含义 | 1 | 16 | ADDR | NUM | BYTECNT | DATA1 | DATAn | CRCL | CRCH |
地址 | 功能码 | 首地址参数 | 指令数 (1~100) | 字节数 | 第1个数据 | 第n个数据 | CRC校验 |
控制器响应返回数据格式为:
字节 | 0 | 1 | 2~3 | 4~5 | 6 | 7 |
含义 | 1 | 16 | ADDR | NUM | CRCL | CRCH |
地址 | 功能码 | 写入首地址 | 指令数 | CRC校验 |
第1个槽位的地址为0020,共10个槽,依次写入每一个槽位放置的物料的类型
和数量
触摸屏发送:1 16 0 20 0 10 20 1 2 3 4 5 6 7 8 ……CRC
控制器返回:1 16 0 20 0 10 CRC
使能命令:
使能:地址为0001
启动:地址为0002
停止:地址为0003
急停:地址为0004
发送启动命令的数据为:
客户端请求: 1 16 0 2 0 1 2 0 1 CRC
服务器响应: 1 16 0 2 0 1 CRC
(3)CRC校验函数
cBuffer:计算CRC校验码的数组。
iBufLen:该数组的长度。
unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen)
{
unsigned int i, j; //#define wPolynom 0xA001
unsigned int wCrc = 0xffff;
unsigned int wPolynom = 0xA001;
/*---------------------------------------------------------------------------------*/
for (i = 0; i < iBufLen; i++)
{
wCrc ^= cBuffer[i];
for (j = 0; j < 8; j++)
{
if (wCrc &0x0001)
{ wCrc = (wCrc >> 1) ^ wPolynom; }
else
{ wCrc = wCrc >> 1; }
}
}
return wCrc;
}