五台水泵时间比较控制块,用于补偿一直关注老董的朋友们。一个项目系列中其他的功能都差不多了,就差一个自动程序,难点不在于自动控制,自动控制主要就是判断PID的输出是否达到最大频率,达到就再开一台泵,小于最小频率就自动停一台。无所谓品牌,思路是重要的。
以下功能块实现了根据备妥条件、运行信号、累计运行时间、本次运行时间,自动启停五台水泵。
![五台水泵控制,比较累计时间、运行时间,结构化文本编程,思路清晰](http://p2.ttnews.xyz/loading.gif)
难点在于五台水泵谁先开谁先停。
前面老董一直再铺垫扫描周期,其实这对程序员来讲很好弄懂,但是对于梯形图入门的自动化工程师就不太好理解了。
程序如下:使用请删除注释 /*注释*/
接口:
![五台水泵控制,比较累计时间、运行时间,结构化文本编程,思路清晰](http://p2.ttnews.xyz/loading.gif)
接口
实现:
/*统计当前运行台数*/
PUMP_RUN_NUM:=BOOL_TO_INT (IN :=PUMP1_RUN)+BOOL_TO_INT (IN :=PUMP2_RUN)+BOOL_TO_INT (IN :=PUMP3_RUN)+BOOL_TO_INT (IN :=PUMP4_RUN)+BOOL_TO_INT (IN :=PUMP5_RUN);
/*判断各台水泵是否已经运行或自动未备妥,则复位该泵的启动储存位*/
IF PUMP1_RUN OR NOT PUMP1_AUTOREAD THEN
PUMP1_NBSTA:=FALSE;
END_IF;
IF PUMP2_RUN OR NOT PUMP2_AUTOREAD THEN
PUMP2_NBSTA:=FALSE;
END_IF;
IF PUMP3_RUN OR NOT PUMP3_AUTOREAD THEN
PUMP3_NBSTA:=FALSE;
END_IF;
IF PUMP4_RUN OR NOT PUMP4_AUTOREAD THEN
PUMP4_NBSTA:=FALSE;
END_IF;
IF PUMP5_RUN OR NOT PUMP5_AUTOREAD THEN
PUMP5_NBSTA:=FALSE;
END_IF;
/*判断各台水泵是否已经停止,如果停止则复位该泵的停止储存位*/
IF NOT PUMP1_RUN THEN
PUMP1_NBSTP:=FALSE;
END_IF;
IF NOT PUMP2_RUN THEN
PUMP2_NBSTP:=FALSE;
END_IF;
IF NOT PUMP3_RUN THEN
PUMP3_NBSTP:=FALSE;
END_IF;
IF NOT PUMP4_RUN THEN
PUMP4_NBSTP:=FALSE;
END_IF;
IF NOT PUMP5_RUN THEN
PUMP5_NBSTP:=FALSE;
END_IF;
泵的启动
/*判断应启动台数是否小于运行台数*/
IF PUMP_RUN_NUM < PUMP_STA_NUM THEN
/*判断其他四台泵的启动标志位,如果存在启动标志位则跳过当前泵,如果不存在,判断本台泵是否具备启动条件也就是自动准备好并且没有运行*/
IF PUMP1_NBSTA=FALSE AND PUMP2_NBSTA=FALSE AND PUMP3_NBSTA=FALSE AND PUMP4_NBSTA=FALSE AND PUMP5_NBSTA=FALSE AND PUMP1_AUTOREAD AND NOT PUMP1_RUN THEN
/*判断累计运行时间是否时本台最小并且有其他泵及比本台泵累计时间短且自动备妥*/
IF (PUMP1_TOLTIME<=PUMP2_TOLTIME OR (NOT PUMP2_AUTOREAD) OR PUMP2_RUN ) AND (PUMP1_TOLTIME<=PUMP3_TOLTIME OR (NOT PUMP3_AUTOREAD) OR PUMP3_RUN ) AND (PUMP1_TOLTIME<=PUMP4_TOLTIME OR (NOT PUMP4_AUTOREAD) OR PUMP4_RUN) AND (PUMP1_TOLTIME<=PUMP5_TOLTIME OR (NOT PUMP5_AUTOREAD) OR PUMP5_RUN) THEN
PUMP1_STA:=TRUE;
PUMP1_NBSTA:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTA=FALSE AND PUMP2_NBSTA=FALSE AND PUMP3_NBSTA=FALSE AND PUMP4_NBSTA=FALSE AND PUMP5_NBSTA=FALSE AND PUMP2_AUTOREAD AND NOT PUMP2_RUN THEN
IF (PUMP2_TOLTIME<=PUMP1_TOLTIME OR (NOT PUMP1_AUTOREAD) OR PUMP1_RUN ) AND (PUMP2_TOLTIME<=PUMP3_TOLTIME OR (NOT PUMP3_AUTOREAD) OR PUMP3_RUN ) AND (PUMP2_TOLTIME<=PUMP4_TOLTIME OR (NOT PUMP4_AUTOREAD) OR PUMP4_RUN) AND (PUMP2_TOLTIME<=PUMP5_TOLTIME OR (NOT PUMP5_AUTOREAD) OR PUMP5_RUN) THEN
PUMP2_STA:=TRUE;
PUMP2_NBSTA:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTA=FALSE AND PUMP2_NBSTA=FALSE AND PUMP3_NBSTA=FALSE AND PUMP4_NBSTA=FALSE AND PUMP5_NBSTA=FALSE AND PUMP3_AUTOREAD AND NOT PUMP3_RUN THEN
IF (PUMP3_TOLTIME<=PUMP1_TOLTIME OR (NOT PUMP1_AUTOREAD) OR PUMP1_RUN ) AND (PUMP3_TOLTIME<=PUMP2_TOLTIME OR (NOT PUMP2_AUTOREAD) OR PUMP2_RUN ) AND (PUMP3_TOLTIME<=PUMP4_TOLTIME OR (NOT PUMP4_AUTOREAD) OR PUMP4_RUN) AND (PUMP3_TOLTIME<=PUMP5_TOLTIME OR (NOT PUMP5_AUTOREAD) OR PUMP5_RUN) THEN
PUMP3_STA:=TRUE;
PUMP3_NBSTA:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTA=FALSE AND PUMP2_NBSTA=FALSE AND PUMP3_NBSTA=FALSE AND PUMP4_NBSTA=FALSE AND PUMP5_NBSTA=FALSE AND PUMP4_AUTOREAD AND NOT PUMP4_RUN THEN
IF (PUMP4_TOLTIME<=PUMP1_TOLTIME OR (NOT PUMP1_AUTOREAD) OR PUMP1_RUN ) AND (PUMP4_TOLTIME<=PUMP2_TOLTIME OR (NOT PUMP2_AUTOREAD) OR PUMP2_RUN ) AND (PUMP4_TOLTIME<=PUMP3_TOLTIME OR (NOT PUMP3_AUTOREAD) OR PUMP3_RUN) AND (PUMP4_TOLTIME<=PUMP5_TOLTIME OR (NOT PUMP5_AUTOREAD) OR PUMP5_RUN) THEN
PUMP4_STA:=TRUE;
PUMP4_NBSTA:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTA=FALSE AND PUMP2_NBSTA=FALSE AND PUMP3_NBSTA=FALSE AND PUMP4_NBSTA=FALSE AND PUMP5_NBSTA=FALSE AND PUMP5_AUTOREAD AND NOT PUMP5_RUN THEN
IF (PUMP5_TOLTIME<=PUMP1_TOLTIME OR (NOT PUMP1_AUTOREAD) OR PUMP1_RUN ) AND (PUMP5_TOLTIME<=PUMP2_TOLTIME OR (NOT PUMP2_AUTOREAD) OR PUMP2_RUN ) AND (PUMP5_TOLTIME<=PUMP3_TOLTIME OR (NOT PUMP3_AUTOREAD) OR PUMP3_RUN)AND (PUMP5_TOLTIME<=PUMP4_TOLTIME OR (NOT PUMP4_AUTOREAD) OR PUMP4_RUN) THEN
PUMP5_STA:=TRUE;
PUMP5_NBSTA:=TRUE;
END_IF;
END_IF;
END_IF;
泵的停止
参考泵的启动,看明白启动停止也就明白了
IF PUMP_RUN_NUM > PUMP_STA_NUM THEN
IF PUMP1_NBSTP=FALSE AND PUMP2_NBSTP=FALSE AND PUMP3_NBSTP=FALSE AND PUMP4_NBSTP=FALSE AND PUMP5_NBSTP=FALSE AND PUMP1_AUTOREAD AND PUMP1_RUN THEN
IF (PUMP1_TOLTIME>=PUMP2_TOLTIME OR ( NOT PUMP2_AUTOREAD) OR NOT PUMP2_RUN ) AND (PUMP1_TOLTIME>=PUMP3_TOLTIME OR ( NOT PUMP3_AUTOREAD) OR NOT PUMP3_RUN ) AND (PUMP1_TOLTIME>=PUMP4_TOLTIME OR ( NOT PUMP4_AUTOREAD) OR NOT PUMP4_RUN) AND (PUMP1_TOLTIME>=PUMP5_TOLTIME OR ( NOT PUMP5_AUTOREAD) OR NOT
PUMP5_RUN) THEN
PUMP1_STA:=FALSE;
PUMP1_NBSTP:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTP=FALSE AND PUMP2_NBSTP=FALSE AND PUMP3_NBSTP=FALSE AND PUMP4_NBSTP=FALSE AND PUMP5_NBSTP=FALSE AND PUMP2_AUTOREAD AND PUMP2_RUN THEN
IF (PUMP2_TOLTIME>=PUMP1_TOLTIME OR ( NOT PUMP1_AUTOREAD) OR NOT PUMP1_RUN ) AND (PUMP2_TOLTIME>=PUMP3_TOLTIME OR ( NOT PUMP3_AUTOREAD) OR NOT PUMP3_RUN ) AND (PUMP2_TOLTIME>=PUMP4_TOLTIME OR ( NOT PUMP4_AUTOREAD) OR NOT PUMP4_RUN) AND (PUMP2_TOLTIME>=PUMP5_TOLTIME OR ( NOT PUMP5_AUTOREAD) OR NOT
PUMP5_RUN) THEN
PUMP2_STA:=FALSE;
PUMP2_NBSTP:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTP=FALSE AND PUMP2_NBSTP=FALSE AND PUMP3_NBSTP=FALSE AND PUMP4_NBSTP=FALSE AND PUMP5_NBSTP=FALSE AND PUMP3_AUTOREAD AND PUMP3_RUN THEN
IF (PUMP3_TOLTIME>=PUMP1_TOLTIME OR ( NOT PUMP1_AUTOREAD) OR NOT PUMP1_RUN ) AND (PUMP3_TOLTIME>=PUMP2_TOLTIME OR ( NOT PUMP2_AUTOREAD) OR NOT PUMP2_RUN ) AND (PUMP3_TOLTIME>=PUMP4_TOLTIME OR ( NOT PUMP4_AUTOREAD) OR NOT PUMP4_RUN) AND (PUMP3_TOLTIME>=PUMP5_TOLTIME OR ( NOT PUMP5_AUTOREAD) OR NOT
PUMP5_RUN) THEN
PUMP3_STA:=FALSE;
PUMP3_NBSTP:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTP=FALSE AND PUMP2_NBSTP=FALSE AND PUMP3_NBSTP=FALSE AND PUMP4_NBSTP=FALSE AND PUMP5_NBSTP=FALSE AND PUMP4_AUTOREAD AND PUMP4_RUN THEN
IF (PUMP4_TOLTIME>=PUMP1_TOLTIME OR ( NOT PUMP1_AUTOREAD) OR NOT PUMP1_RUN ) AND (PUMP4_TOLTIME>=PUMP2_TOLTIME OR ( NOT PUMP2_AUTOREAD) OR NOT PUMP2_RUN ) AND (PUMP4_TOLTIME>=PUMP3_TOLTIME OR ( NOT PUMP3_AUTOREAD) OR NOT PUMP3_RUN) AND (PUMP4_TOLTIME>=PUMP5_TOLTIME OR ( NOT PUMP5_AUTOREAD) OR NOT
PUMP5_RUN) THEN
PUMP4_STA:=FALSE;
PUMP4_NBSTP:=TRUE;
END_IF;
END_IF;
IF PUMP1_NBSTP=FALSE AND PUMP2_NBSTP=FALSE AND PUMP3_NBSTP=FALSE AND PUMP4_NBSTP=FALSE AND PUMP5_NBSTP=FALSE AND PUMP5_AUTOREAD AND PUMP5_RUN THEN
IF (PUMP5_TOLTIME>=PUMP1_TOLTIME OR ( NOT PUMP1_AUTOREAD) OR NOT PUMP1_RUN ) AND (PUMP5_TOLTIME>=PUMP2_TOLTIME OR ( NOT PUMP2_AUTOREAD) OR NOT PUMP2_RUN ) AND (PUMP5_TOLTIME>=PUMP3_TOLTIME OR ( NOT PUMP3_AUTOREAD) OR NOT PUMP3_RUN)AND (PUMP5_TOLTIME>=PUMP4_TOLTIME OR ( NOT PUMP4_AUTOREAD) OR NOT
PUMP4_RUN) THEN
PUMP5_STA:=FALSE;
PUMP5_NBSTP:=TRUE;
END_IF;
END_IF;
END_IF;
/*所有未备妥水泵全部停止输出*/
IF NOT PUMP1_AUTOREAD THEN
PUMP1_STA:=FALSE;
END_IF;
IF NOT PUMP2_AUTOREAD THEN
PUMP2_STA:=FALSE;
END_IF;
IF NOT PUMP3_AUTOREAD THEN
PUMP3_STA:=FALSE;
END_IF;
IF NOT PUMP4_AUTOREAD THEN
PUMP4_STA:=FALSE;
END_IF;
IF NOT PUMP5_AUTOREAD THEN
PUMP5_STA:=FALSE;
END_IF;
引用:
我是老董,关注我学习更多电气自动化知识。
閱讀更多 老董聊電氣自動化 的文章