Lonworks网络虚拟监测系统研究
when(io_in_ready(s_bus)) //并口有数据来
{
p_in.length=DATA_SIZE
io_in(s_bus,&p_in); //从并口读取数据
//构造显式报文
msg_out.code=CONTRL_MSG //CONTRL_MSG是预定义的消息代码
memcpy(msg_out.data,p_in.data,3);
msg_out.dest_addr.bcast.type=BROADCAST;
msg_out.dest_addr.bcast.domain=0;
msg_out.dest_addr.bcast.subnet=0;
msg_out.tag=tag_out0;
msg_send();
}
一般情况下,节点通过when(msg_arrives(CONTRL_MSG))接收该消息,然后判断消息数据的第一个字节的节点信息,如果不是本节点,则不作处理,如果是本节点,再判断第二个字节的通道号,然后作相应的处理并将选中通道的数据传送出去。
3.2 测量数据的传输
在测控系统中,各个需要测量的参数每次需要采集的数据个数可能各不相同,少的可能只有一个数据,多的可能有上千个数据,因此节点收到虚拟仪器传来的控制信号后,选中通道的监测数据要采用显式消息报文传输。在LON网中,设计的接口卡也是一个节点,当其余节点收到发给本节点的控制信号后,会同时将相应通道的数据都发送到接口卡上。笔者采用的是消息标签寻址。消息标签是显式消息的一个连接点。网络管理工具给输入标签和每个输出标签都会赋一个唯一的网络地址。这样,利用捆绑器可将各个节点发送给接口卡的显式报文的消息标签与接口卡节点的消息输入对象msg_in连接起来,这样就可以实现点对点的数据传送。下面以节点2收到要求发送给1号通道的数据,且该通道每次发送40个字节的数据为例,给出其发送程序:
msg_tag LON_232;
when(msg_arrives(CONTRL_MSG))
{
if(msg_in.data[0]==2)
{
switch(msg_in.data[1])
{ case 1: //通道1
msg_out.tag=LON_232;
msg_out.code=0x0c; //消息代码,接口卡依此处理接收的数据
msg_out.service=ACKD;
memcpy(msg_out.data,ch1_buf,40);
msg_send();
评论