硬件配置
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的站点实例