logo资料库

显控HMI触摸屏自由口协议案例.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
15.2 自由口协议案例 SKTOOL 用户手册 在介绍了一个简单的宏指令实例后,相信您已经会使用宏指令和建立相应的组态了,接下来将介绍一个自由口协议的案例。 首先,先建立三个组态: 组态 1 组态 2 481
SKTOOL 用户手册 组态 1 和组态 3 右侧的 6 个控件为数值显示控件,监视地址从上至下分别为 LW60297,LW60298,LW60299,LW60300,LW60301 和 LW60302=1。两个红色的控件为位指示灯控件,监视地址分别为 LB100 和 LB101。组态 3 下面的控件是数值显示控件,监视地址从 LW400 组态 3 开始,地址间隔为 1。 组态 2 中设置两个画面按钮的“高级”为: 482
全局宏设定为: SKTOOL 用户手册 483
SKTOOL 用户手册 Marco_COM 的代码为: #include "MacroInit.h" void Macro_main(IN *p) { MarcoInit LocalWord[60297] = 0; LocalWord[60298] = 3; LocalWord[60299] = 0; LocalWord[60300] = 1; LocalWord[60302] = 1; char Pdata[20]; char Gdata[100]; //发送数据存储数组 //接收数据存储数组 int result; //接收返回数据的长度 if (LocalBit[0] == 0) //LB0 为发送接收标志,为 0 发送状态,1 等待接收状态 { Pdata[0] = LocalWord[200]; //所要发送的数据 Pdata[1] = LocalWord[201]; Pdata[2] = LocalWord[202]; Pdata[3] = LocalWord[203]; PUTCHARS(0, Pdata, 4); //发送函数,发送数据到串口 484
SKTOOL 用户手册 LocalBit[0] = 1; //发送完毕,下次进入不发送,等待接收 return; //退出等待接收 } else { result = GETCHARS(0, Gdata); //接收函数,把接收到的数据存在 Gdata 数组中 LocalWord[0] = result; //查看接收长度 if (result <= 0) { //返回 0 和-1 表示没有接收到或者接收错误 ++LocalWord[1]; //超时判断,开始计数 if (LocalWord[1] >= 3) //等待 3 个本宏指令执行时间 { LocalWord[1] = 0; //计数清零 LocalBit[0] = 0; //发送标志清零,下次进入发送 } return; //直接退出 //接收正确 LocalWord[2] = Gdata[0] & 0xff; //数据接收处理 LocalWord[3] = Gdata[1] & 0xff; LocalWord[4] = Gdata[2]; LocalWord[5] = Gdata[3]; LocalBit[0] = 0; //处理完毕,下次进入时发送 PUTCHARS(0, Pdata, 0); //清除缓冲区 } else { } } } Marco1 的代码为: #include "MacroInit.h" void Macro_main(IN *p) { MarcoInit LocalWord[60297] = 0; LocalWord[60298] = 3; LocalWord[60299] = 0; LocalWord[60300] = 1; LocalWord[60302] = 1; char Pdata[20]; char Mdata[100]; //发送数据存储数组 //接收数据存储数组 485
unsigned short Wcrc; int result; SKTOOL 用户手册 //存放 CRC 校验结果 //接收返回数据的长度 if (LocalBit[0] == 0) //LB0 为发送接收标志,为 0 发送状态,1 等待接收状态 { else { Pdata[0] = 0x02; Pdata[1] = 0x03; Pdata[2] = 0x00; Pdata[3] = 0x00; Pdata[4] = 0x00; Pdata[5] = 0x03; //发送数据,读保持寄存器,第一字节为从站地址 //功能码 16 进制 03,读保持寄存器 //需要读的数据,其开始地址 //读的数据,其字长 Wcrc = CRC(Pdata, 6); //对前面的数据,进行 CRC 校验 Pdata[6] = (Wcrc & 0xff); //CRC 的数据,进行高低位互换,P6 取低位 Pdata[7] = (Wcrc >> 8); //P7 取高位 PUTCHARS(0, Pdata, 8); //发送函数,将整个数据发送到串口 LocalBit[0] = 1; //发送完毕,下次进入不发送,等待接收 return; //退出等待接收 } result = GETCHARS(0, Mdata); //接收函数,把接收到的数据存在 Gdata 数组中 LocalWord[0] = result; //查看接收长度 if (result <= 0) //返回 0 和-1 表示没有接收到或者接收错误 { } ++LocalWord[1]; //超时判断,开始计数 if (LocalWord[1] >= 3) //等待 3 个本宏指令执行时间 { } return; LocalWord[1] = 0; //计数清零 LocalBit[0] = 0; //发送标志清零,下次进入发送 //直接退出 else //接收正确 { LocalWord[400] = Mdata[0]&0xff; //数据接收处理 LocalWord[401] = Mdata[1]&0xff; LocalWord[402] = Mdata[2]&0xff; LocalWord[403] = Mdata[3]&0xff; LocalWord[404] = Mdata[4]&0xff; LocalWord[405] = Mdata[5]&0xff; LocalWord[406] = Mdata[6]&0xff; LocalWord[407] = Mdata[7]&0xff; LocalWord[408] = Mdata[8]&0xff; LocalWord[409] = Mdata[9]&0xff; 486
SKTOOL 用户手册 LocalWord[410] = Mdata[10]&0xff; LocalBit[0] = 0; //处理完毕,下次进入时发送 PUTCHARS(0, Pdata, 0); //清除缓冲区 } } } 函数编译框中的变量设定的名称与地址相同。 函数编译框中的变量设定的名称与地址相同。 487
分享到:
收藏