博文

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

约 1 分钟

硬件配置

RS485设置

主要功能块

RS485_Link_Manage功能块

RS485_Link_Config功能块

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的站点实例

相关阅读

← 返回博文列表