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