ST言語で機械保全技能士の課題回答2
ラダープログラムは少し書けますが、メーカー問わず扱うことのできるST言語を勉強中です。ST言語はテキストベースのプログラミング言語でC言語に似た構文を持ちます。勉強の環境としてはキーエンスPLC(KV-8000)でシミュレータエディットで動作確認しながらしています。
まずはキーエンスのプログラムをかける人でもわかるように、変数を扱わずにプログラム作成をしています。
■KV-8000機器構成

入力:R34000~
出力:R34100~

2級向け回路
どうしてもカウンタを使わないと作成できませんでした。
ラダープログラムだとカウンタなしで作成できます。
//ランプタイマー設定
TMR (MR2004, T1, 20);
TMR (MR4000, T2, 30);
TMR (MR4002, T3, 5);
TMR (MR4004, T4, 5);
//ランプ停止条件
IF R34002 THEN
MR1000 := FALSE;
MR1002 := FALSE;
RES(MR2002);
DM1002 := 0;
RES(MR3002);
RES(MR4000);
RES(MR4002);
RES(MR4004);
DM1000 := 0;
END_IF;
/////////////////////////////////////////
WLランプオルタネイト回路
MR3000 := LDP(R34000); //PB↑
IF ((MR3000 AND (NOT MR3002)) OR ((NOT MR3000) AND MR3002)) THEN
MR3002 := TRUE;
ELSE
MR3002 := FALSE;
END_IF;
//WLランプ出力
R34100 := MR3002;
//////////////////////////////////////
IF R34000 THEN
MR1000 := TRUE;
END_IF;
IF R34001 THEN
MR1002 := TRUE;
END_IF;
//YLランプ
MR2000 := LDP(R34001); //PB↑
IF MR2000 THEN
INC(DM1002);
END_IF;
IF (DM1000 =1) AND (DM1002 =1) THEN
SET(MR2002);
END_IF;
IF MR2002 AND (DM1000 =2) THEN
RES(MR2002);
SET(MR2004);
END_IF;
IF (DM1000 =3) AND (DM1002 =2) THEN
SET(MR2006);
END_IF;
IF (MR2006) AND (R34002) THEN
SET(MR2004);
END_IF;
//YLランプ停止
IF T1 = TRUE THEN
RES(MR1000);
RES(MR1002);
RES(MR2004);
RES(MR2006);
END_IF;
//YLランプ出力
R34101 := MR2002 OR MR2004 OR MR2006;
///////////////////////////GLランプ運転
IF MR3000 THEN
INC(DM1000);
END_IF;
IF DM1000 = 2 THEN
SET(MR5000);
ELSE
RES(MR5000);
END_IF;
MR5002 := LDP(MR5000); //PB↑
IF MR5002 THEN
SET(MR4000);
SET(MR4002);
END_IF;
IF T2 = TRUE THEN
RES(MR4002);
RES(MR4004);
END_IF;
IF T3 = TRUE THEN
RES(MR4002);
SET(MR4004);
END_IF;
//GLランプ停止
IF T4 = TRUE THEN
MR4004 := TRUE;
MR4002 := FALSE;
END_IF;
IF T4 = TRUE THEN
MR4002 := TRUE;
MR4004 := FALSE;
END_IF;
//GL出力
R34102 := (DM1000 = 1) OR (MR4002 = TRUE) OR (DM1000 = 3) ;