回复:S7-1200PLC与船上VDR设备进行通讯,要求使用NMEA-0183协议,是不是通过RS485自由端口编写?

无心打扰

西门子1847工业学习平台

  • 帖子

    359
  • 精华

    5
  • 被关注

    152

论坛等级:侠圣

注册时间:2009-07-15

黄金 黄金 如何晋级?

发布于 2019-10-12 14:53:31

8楼

VDR要看发什么设备的数据,机舱监测报警的以前做过一个,

////Send Data To VDR通讯

FUNCTION Send_Data_VDR: VOID  //FC901


VAR_TEMP

    

   index:Int;

   Mod_o:INT;

   Time_Now:DATE_AND_TIME;

   Time_Array AT Time_Now:ARRAY[0..7] OF BYTE ;

   Ret_V:INT;

   Temp_Byte:byte;

   Time_Send:ARRAY[0..7] OF CHAR ; 

   Temp:BYTE;

   


END_VAR

  


BEGIN


    //获取时间

      Ret_V:=READ_CLK(CDT := Time_Now // OUT: DATE_AND_TIME

         ); // INT

    //得出时间的HH

    Temp:=Time_Array[3] AND B#16#0F;

    Time_Send[1]:=BYTE_TO_CHAR(b#16#30 OR Temp);

    Temp:=ROL(IN:=Time_Array[3],

              N:=4);

    Temp:=Temp AND B#16#0F;

    Time_Send[0]:=BYTE_TO_CHAR(b#16#30 OR Temp); 

    //得出时间的MM

    Temp:=Time_Array[4] AND B#16#0F;

    Time_Send[3]:=BYTE_TO_CHAR(b#16#30 OR Temp);

    Temp:=ROL(IN:=Time_Array[4],

              N:=4);

    Temp:=Temp AND B#16#0F;

    Time_Send[2]:=BYTE_TO_CHAR(b#16#30 OR Temp); 

    //得出时间的SS

    Temp:=Time_Array[5] AND B#16#0F;

    Time_Send[5]:=BYTE_TO_CHAR(b#16#30 OR Temp);

    Temp:=ROL(IN:=Time_Array[5],

              N:=4);

    Temp:=Temp AND B#16#0F;

    Time_Send[4]:=BYTE_TO_CHAR(b#16#30 OR Temp);

    

   

       //得出时间的SS

    Temp:=Time_Array[6] AND B#16#0F;

    Time_Send[7]:=BYTE_TO_CHAR(b#16#30 OR Temp);

    Temp:=ROL(IN:=Time_Array[6],

              N:=4);

    Temp:=Temp AND B#16#0F;

    Time_Send[6]:=BYTE_TO_CHAR(b#16#30 OR Temp); 

    

    

               

    FOR index := 0 TO 19 BY 1 DO             

    // 初始化数据头

    VDR.ALR[index].Head[0]:= BYTE_TO_CHAR(B#16#24);    

    VDR.ALR[index].Head[1]:= 'E'; 

    VDR.ALR[index].Head[2]:= 'R';

    VDR.ALR[index].Head[3]:= 'A';

    VDR.ALR[index].Head[4]:= 'L';

    VDR.ALR[index].Head[5]:= 'R'; 

    //初始化数据的中间符号位

    VDR.ALR[index].UTCTime[0]:= ','; 

    VDR.ALR[index].AlarmIdx[0]:= ','; 

    VDR.ALR[index].AlarmStatus[0]:= ','; 

    VDR.ALR[index].AlarmAck[0]:= ',';             

   // 初始化数据尾

    VDR.ALR[index].END_CR:= B#16#0D; 

    VDR.ALR[index].END_LF:= B#16#0A;

    //当前发送帧的时间

    VDR.ALR[index].UTCTime[1]:= Time_Send[0]; VDR.ALR[index].UTCTime[2]:= Time_Send[1];

    VDR.ALR[index].UTCTime[3]:= Time_Send[2]; VDR.ALR[index].UTCTime[4]:= Time_Send[3];

    VDR.ALR[index].UTCTime[5]:= Time_Send[4]; VDR.ALR[index].UTCTime[6]:= Time_Send[5];

    VDR.ALR[index].UTCTime[7]:= '.';

    VDR.ALR[index].UTCTime[8]:= Time_Send[6]; VDR.ALR[index].UTCTime[9]:=Time_Send[7];

END_FOR;

    

 FOR index := 0 TO 14 BY 1 DO  

    db902.DBB[index] :=db10.DBB[index] ;         

END_FOR;


FOR index:=0 TO 38 BY 1 DO

    VDR.ALR[index].AlarmIdx[1]:= '0'; 

    VDR.ALR[index].AlarmIdx[2]:= '0';

    VDR.ALR[index].AlarmIdx[3]:= '0';

    IF index >=10 AND index< 20 THEN VDR.ALR[index].AlarmIdx[2]:= '1';END_IF;

    IF index >=20 AND index< 30 THEN VDR.ALR[index].AlarmIdx[2]:= '2';END_IF;

    IF index >=30 AND index< 40 THEN VDR.ALR[index].AlarmIdx[2]:= '3';END_IF;

    MOD_o:= index MOD 10;

      CASE MOD_o OF

        0 :

            VDR.ALR[index].AlarmIdx[3]:= '0';

        1 :

            VDR.ALR[index].AlarmIdx[3]:= '1';


        2 :

            VDR.ALR[index].AlarmIdx[3]:= '2';


        3 :

            VDR.ALR[index].AlarmIdx[3]:= '3';


        4 :

            VDR.ALR[index].AlarmIdx[3]:= '4';


        5 :

            VDR.ALR[index].AlarmIdx[3]:= '5';


        6 :

            VDR.ALR[index].AlarmIdx[3]:= '6';


        7 :

            VDR.ALR[index].AlarmIdx[3]:= '7';


        8 :

            VDR.ALR[index].AlarmIdx[3]:= '8';


        9 :

            VDR.ALR[index].AlarmIdx[3]:= '9';


   

    ELSE:

        // Statements_ELSE

        ;

    END_CASE;


        

    IF DB902.Data[80 + index] THEN VDR.ALR[index].AlarmStatus[1]:= 'A'; ELSE VDR.ALR[index].AlarmStatus[1]:= 'V';END_IF;

    IF DB902.Data[80 + index] THEN VDR.ALR[index].AlarmAck[1]:= 'A'; ELSE VDR.ALR[index].AlarmAck[1]:= 'V';END_IF;

    IF DB902.Data[2*index + 0] THEN VDR.ALR[index].AlarmText:= 'OPEN WB_H'; END_IF;

    IF DB902.Data[2*index + 1] THEN VDR.ALR[index].AlarmText:= 'CLOSE WB_H'; END_IF;

END_FOR;

 

                 

END_FUNCTION


我是个愚笨的人……
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15234条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。