美文网首页
台达DVP-MC系列与DTE温控通信

台达DVP-MC系列与DTE温控通信

作者: TomatoTor | 来源:发表于2020-08-17 22:18 被阅读0次

硬件配置

RS485设置

主要功能块

RS485_Link_Manage

RS485_Link_Manage功能块

RS485_Link_Config

RS485_Link_Config功能块

RS485_Link_Status

RS485_Link_Status功能块

变量声明

范围  |名称                      |地址       |数据类型             |初始值   |注释
VAR   |g_UiWriteBufferAddress   |%MW1000    |ARRAY[1..100] OF UINT      
VAR   |g_UiReadBufferAddress    |%MW1100    |ARRAY[1..100] OF UINT      

Pro_DTE

UiReadDestinationAddress[1]  := 16#1000 ;
UiReadDestinationAddress[2]  := 16#1000 ;
UiReadDestinationAddress[3]  := 16#1000 ;
UiReadDestinationAddress[4]  := 16#1000 ;
UiReadDestinationAddress[5]  := 16#1000 ;
CASE iStep[1]  OF
    1: //设定与读取温度
        FOR UiSite := 1 TO 5 BY 1 DO 
            UiWriteDestinationAddress[UiSite] := 16#1008 ;  
        END_FOR;
        FOR UiAddress := 1 TO 40 BY 1 DO 
            g_UiWriteBufferAddress[UiAddress] := 设定温度[UiAddress] ;
        END_FOR;
        iStep[1] := 10 ;
    2: //温控开关
        FOR UiSite := 1 TO 5 BY 1 DO 
            UiWriteDestinationAddress[UiSite] := 16#10D8 ;
        END_FOR;        
        FOR UiAddress := 1 TO 40 BY 1 DO 
            g_UiWriteBufferAddress[UiAddress] := 温控开关[UiAddress] ;
        END_FOR;
        iStep[1] := 10 ;
    3: //温控整定
        FOR UiSite := 1 TO 5 BY 1 DO 
            UiWriteDestinationAddress[UiSite] := 16#10E0 ;          
        END_FOR;
        FOR UiAddress := 1 TO 40 BY 1 DO 
            g_UiWriteBufferAddress[UiAddress] := g_iHeatSwitch[UiAddress] ;
        END_FOR;
        iStep[1] := 10 ;
    4: //温控控制周期
        FOR UiSite := 1 TO 5 BY 1 DO 
            UiWriteDestinationAddress[UiSite] := 16#10C8 ;          
        END_FOR;
        FOR UiAddress := 1 TO 40 BY 1 DO 
            g_UiWriteBufferAddress[UiAddress] := 1 ;
        END_FOR;
        iStep[1] := 10 ;
    10: 
        bRS485OK := FALSE ;
        FOR UiSite := 1 TO 5 BY 1 DO 
            Link_Config[UiSite].LinkNum                     := UiSite ;
            Link_Config[UiSite].EnableLink                  := TRUE ;
            Link_Config[UiSite].Noncyclic                   := TRUE ;
            Link_Config[UiSite].SlaveNodeID                 := UINT_TO_USINT(In:= UiSite) ;
            Link_Config[UiSite].ObjType                     := 0 ;
            Link_Config[UiSite].En_FunCode17                := FALSE ;
            Link_Config[UiSite].TimeOut                     := 500 ;            
            Link_Config[UiSite].Write_Buffer_Address_Offset := 0 ;
            Link_Config[UiSite].Write_Destination_Address   := UiWriteDestinationAddress[UiSite] ;
            Link_Config[UiSite].Write_Length                := 8 ;      
            Link_Config[UiSite].Read_Buffer_Address_Offset  := 0 ;
            Link_Config[UiSite].Read_Destination_Address    := UiReadDestinationAddress[UiSite] ;       
            Link_Config[UiSite].Read_Length                 := 8 ;
        END_FOR;
        Link_Manage.Open                           := TRUE ;        
        iStep[1]                                   := 100 ;
        iCount[1]                                  := iCount[1] + 1 ;
    100:
        IF  Link_Config[1].Done AND Link_Config[2].Done AND Link_Config[3].Done AND Link_Config[4].Done AND Link_Config[5].Done THEN
            FOR UiAddress := 1 TO 40 BY 1 DO 
                当前温度[UiAddress] := g_UiReadBufferAddress[UiAddress] ;
            END_FOR;
            bRS485OK               := TRUE ;
            Link_Manage.Open       := FALSE ; 
            iStep[1]               := 0 ;
        END_IF;
END_CASE;

IF (iCount[1] = 1 ) AND bRS485OK AND EDGENEG(Link_Manage.Open) THEN
    iStep[1] := 2 ;
ELSIF (iCount[1] = 2 ) AND bRS485OK AND EDGENEG(Link_Manage.Open) THEN
    iStep[1] := 3 ; 
ELSIF (iCount[1] >= 3 ) AND bRS485OK AND EDGENEG(Link_Manage.Open) THEN 
    iStep[1] := 1 ;
    iCount[1] := 0 ;
ELSIF EDGEPOS(bRunOnce) THEN //可以改为上电后触发一次
    iStep[1] := 4 ;
    iCount[1] := 0 ;                                            
END_IF;

Link_Manage(Enable:= TRUE);
Link_Config[1](Execute := Link_Manage.LinkOpened, Write_Buffer_Address := g_UiWriteBufferAddress[1],Read_Buffer_Address :=  g_UiReadBufferAddress[1]);
Link_Config[2](Execute := Link_Manage.LinkOpened, Write_Buffer_Address := g_UiWriteBufferAddress[9],Read_Buffer_Address :=  g_UiReadBufferAddress[9]);
Link_Config[3](Execute := Link_Manage.LinkOpened, Write_Buffer_Address := g_UiWriteBufferAddress[17],Read_Buffer_Address :=  g_UiReadBufferAddress[17]);
Link_Config[4](Execute := Link_Manage.LinkOpened, Write_Buffer_Address := g_UiWriteBufferAddress[25],Read_Buffer_Address :=  g_UiReadBufferAddress[25]);
Link_Config[5](Execute := Link_Manage.LinkOpened, Write_Buffer_Address := g_UiWriteBufferAddress[33],Read_Buffer_Address :=  g_UiReadBufferAddress[33]);
Link_Status[1](Enable:= TRUE,LinkNum:= 1);
Link_Status[2](Enable:= TRUE,LinkNum:= 2);
Link_Status[3](Enable:= TRUE,LinkNum:= 3);
Link_Status[4](Enable:= TRUE,LinkNum:= 4);
Link_Status[5](Enable:= TRUE,LinkNum:= 5);

后期还要优化一下,因为控制周期只需要写入一次即可,而整定的需要是人工确认是否需要采用整定的时候再写入一次2020-08-18 Del

结尾

把程序进行了优化,带五个DTE进行了数据采集和操作。程序可执行。
调用程序的任务采用周期模式,周期时间500ms这点需要注意。时间过短有可能出现采集回来的数据都是0值

Log:
2020-08-17 发布本文
2020-08-18 更新程序内容为5个DTE的站点实例

相关文章

网友评论

      本文标题:台达DVP-MC系列与DTE温控通信

      本文链接:https://www.haomeiwen.com/subject/lmscjktx.html