Lonworks網(wǎng)絡(luò)虛擬監(jiān)測系統(tǒng)研究
when(io_in_ready(s_bus)) //并口有數(shù)據(jù)來
{
p_in.length=DATA_SIZE
io_in(s_bus,&p_in); //從并口讀取數(shù)據(jù)
//構(gòu)造顯式報文
msg_out.code=CONTRL_MSG //CONTRL_MSG是預(yù)定義的消息代碼
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();
}
一般情況下,節(jié)點通過when(msg_arrives(CONTRL_MSG))接收該消息,然后判斷消息數(shù)據(jù)的第一個字節(jié)的節(jié)點信息,如果不是本節(jié)點,則不作處理,如果是本節(jié)點,再判斷第二個字節(jié)的通道號,然后作相應(yīng)的處理并將選中通道的數(shù)據(jù)傳送出去。
3.2 測量數(shù)據(jù)的傳輸
在測控系統(tǒng)中,各個需要測量的參數(shù)每次需要采集的數(shù)據(jù)個數(shù)可能各不相同,少的可能只有一個數(shù)據(jù),多的可能有上千個數(shù)據(jù),因此節(jié)點收到虛擬儀器傳來的控制信號后,選中通道的監(jiān)測數(shù)據(jù)要采用顯式消息報文傳輸。在LON網(wǎng)中,設(shè)計的接口卡也是一個節(jié)點,當(dāng)其余節(jié)點收到發(fā)給本節(jié)點的控制信號后,會同時將相應(yīng)通道的數(shù)據(jù)都發(fā)送到接口卡上。筆者采用的是消息標(biāo)簽尋址。消息標(biāo)簽是顯式消息的一個連接點。網(wǎng)絡(luò)管理工具給輸入標(biāo)簽和每個輸出標(biāo)簽都會賦一個唯一的網(wǎng)絡(luò)地址。這樣,利用捆綁器可將各個節(jié)點發(fā)送給接口卡的顯式報文的消息標(biāo)簽與接口卡節(jié)點的消息輸入對象msg_in連接起來,這樣就可以實現(xiàn)點對點的數(shù)據(jù)傳送。下面以節(jié)點2收到要求發(fā)送給1號通道的數(shù)據(jù),且該通道每次發(fā)送40個字節(jié)的數(shù)據(jù)為例,給出其發(fā)送程序:
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; //消息代碼,接口卡依此處理接收的數(shù)據(jù)
msg_out.service=ACKD;
memcpy(msg_out.data,ch1_buf,40);
msg_send();
評論