【ST言語】升目に座標を均等に割り付ける【PLCで構造体を使う】

IEC61131-3
この記事は約11分で読めます。

【ST言語】【構造体の配列処理】【備忘録】

スポンサーリンク

25個の配列を5×5の配列で座標に割り付ける

目的:配列番号順のデータで動くプログラムの座標を生成する

【1】【2】【3】…………..【24】【25】

5X5のイメージ

2122232425
1617181920
1112131415
678910

5x5に座標を割り付けるイメージ

(10,50)(15,50)(20,50)(25,50)(30,50)
(10,40)(15,40)(20,40)(25,40)(30,40)
(10,30)(15,30)(20,30)(25,30)(30,30)
(10,20)(15,20)(20,20)(25,20)(30,20)
(10,10)(15,10)(20,10)(25,10)(30,10)

実行パラメータ

[1,1]~[5,5] に

StartPoint(10,10) 加算パラメータ(X +5 ,Y+10)

構造体宣言



TYPE

	XYZ_ABS_POINT_DATA_STRUCT	:
	STRUCT

		MATRIX_X		:INT;(*トレイ上の割付位置*)
		MATRIX_Y		:INT;(*トレイ上の割付位置*)

		X_ABS_POINT		:DINT; (*アブソ座標X *)
		Y_ABS_POINT		:DINT; (*アブソ座標Y *)
		Z_ABS_POINT		:DINT; (*アブソ座標Z *)

		MOV_VEL			:DINT; (*移動速度 *)


		ITEM1_USE		:BOOL;(* アイテム1*)
		ITEM2_USE		:BOOL;(* アイテム2*)





		(*ID DATA SETTING*)

		CALL_PRG_NO1	:DINT; (*サブプロ呼び出し番号1 *)
		CALL_PRG_NO2	:DINT; (*サブプロ呼び出し番号2 *)
		CALL_PRG_NO3	:DINT; (*サブプロ呼び出し番号3 *)

		POINT_USE		:BOOL;(*このポイントデータを使用する*)

		CALL1_USE		:BOOL;(*指定のサブプロ使用する*)
		CALL2_USE		:BOOL;(*指定のサブプロ使用する*)
		CALL3_USE		:BOOL;(*指定のサブプロ使用する*)


	END_STRUCT;


END_TYPE


(*------- 構造体 XYZ位置データ   200 ポイントデータ定義 -   0:転送時のワークバッファとする------*)
TYPE
	TrayABS_BUF200 : ARRAY[0..200] OF XYZ_ABS_POINT_DATA_STRUCT;
END_TYPE





(*-------------------------------------------------------*)





(*       10*10のますめ作成                *)
TYPE

   MATRIX_X	: ARRAY[1..10] OF INT; (*  *)
   MATRIX_TRAY	: ARRAY[1..10] OF MATRIX_X; (* *)

 
END_TYPE

ローカル変数定義

EXE_JI	BOOL	VAR_INPUT	演算実行x,y		
EXE_IJ	BOOL	VAR_INPUT	演算実行y,x		
MATRIX_X	INT	VAR_INPUT	升目の数 横方向	
MATRIX_Y	INT	VAR_INPUT	升目の数 縦方向	
SP_MATRIX_X	INT	VAR_INPUT	開始配列ポイント	
SP_MATRIX_Y	INT	VAR_INPUT	開始配列ポイント	
START_X_POINT	DINT	VAR_INPUT	基点のX座標 ABS
START_Y_POINT	DINT	VAR_INPUT	基点のY座標  ABS
INC_X	DINT	VAR_INPUT				
INC_Y	DINT	VAR_INPUT				
EXE_ALL_ON	BOOL	VAR_INPUT			
EXE_ALL_OFF	BOOL	VAR_INPUT			
EXE_ALL_VEL	BOOL	VAR_INPUT			
MV_VEL	DINT	VAR_INPUT				
演算中	BOOL	VAR_OUTPUT				
配列	TrayABS_BUF200	VAR_IN_OUT				




EXE_MEM	BOOL	VAR			
EXE_TRG	BOOL	VAR				
i	INT	VAR				
j	INT	VAR				
i_dec	INT	VAR				
配列番号	INT	VAR				
EXE_ALL_ON_TRG	BOOL	VAR				
EXE_ALL_ON_MEM	BOOL	VAR				
EXE_ALL_OFF_TRG	BOOL	VAR				
EXE_ALL_OFF_MEM	BOOL	VAR				
EXE_ALL_VEL_TRG	BOOL	VAR			
EXE_ALL_VEL_MEM	BOOL	VAR			
M1	INT	VAR				
M2	INT	VAR				
M3	INT	VAR				
EXE_MEM2	BOOL	VAR			
EXE_TRG2	BOOL	VAR			
i2	INT	VAR				
j2	INT	VAR				
i_dec2	INT	VAR				
演算中1	BOOL	VAR				
演算中2	BOOL	VAR				
演算中3	BOOL	VAR				
演算中4	BOOL	VAR				
演算中5	BOOL	VAR				
配列番号2	INT	VAR				

(****************************************************
配列100個あるときに

升目 10*10で  10個進むと 加算分を戻す

*****************************************************)


(* X,Yポイントデータ自動加算                               *)
(* 立ち上がりを作成 *********************              *)
(*    2019/3/1                                      *)

(*---------------R_TRG 作成 -----------------------------------------------------------------------------------------------------------*)

EXE_TRG := EXE_JI AND NOT(EXE_MEM);
EXE_MEM := EXE_JI;


EXE_TRG2 := EXE_IJ AND NOT(EXE_MEM2);
EXE_MEM2 := EXE_IJ;



(*-----------------------------------------------------------------------*)

(*----- 列行の順  --------*)

	IF EXE_TRG & NOT(演算中) THEN
		演算中1 := TRUE;

		(*-------------------------------------*)
		FOR j := (SP_MATRIX_Y -1) TO (MATRIX_Y -1) BY 1
			DO

			FOR i := SP_MATRIX_X TO MATRIX_X BY 1
				DO

			 	i_dec := i-1;

				配列番号:= i+(MATRIX_X * j );

			 	配列[ 配列番号 ].X_ABS_POINT := START_X_POINT + ( INC_X * INT_TO_DINT(i_dec) );
 (*演算座標代入 X*)
				配列[ 配列番号 ].Y_ABS_POINT := START_Y_POINT + ( INC_Y * INT_TO_DINT(j)     ); (*演算座標代入 Y*)


			 	配列[ 配列番号 ].MATRIX_X := i; (*演算座標代入 X*)
				配列[ 配列番号 ].MATRIX_Y := j+1; (*演算座標代入 Y*)


				
			END_FOR;

		END_FOR;
		(*---------------------------------------*)

		ELSE 演算中1 := FALSE;

	END_IF;


(*---------------------------------------------------------------*)



(*----- 行列の順  --------*)

	IF EXE_TRG2 & NOT(演算中) THEN

		演算中2 := TRUE;

		(*-------------------------------------*)
		FOR j2 := (SP_MATRIX_Y -1) TO (MATRIX_Y -1) BY 1
			DO

			FOR i2 := SP_MATRIX_X TO MATRIX_X BY 1
				DO

			 	i_dec2 := i2-1;

				配列番号2:= i2+(MATRIX_X * j2 );

			 	配列[ 配列番号2 ].Y_ABS_POINT := START_X_POINT + ( INC_X * INT_TO_DINT(i_dec2) );   
(*演算座標代入 X*)
				配列[ 配列番号2 ].X_ABS_POINT := START_Y_POINT + ( INC_Y * INT_TO_DINT(j2)     ); (*演算座標代入 Y*)


			 	配列[ 配列番号2 ].MATRIX_Y := i2; (*演算座標代入 X*)
				配列[ 配列番号2 ].MATRIX_X := j2+1; (*演算座標代入 Y*)


				
			END_FOR;

		END_FOR;
		(*---------------------------------------*)

		ELSE 演算中2 := FALSE;

	END_IF;


(*--------------------------------------------------------------------------------------------------------------------------*)















(*--------全ビットデータをオン/オフする-------------------------------------------------------*)

EXE_ALL_ON_TRG	:=	EXE_ALL_ON AND NOT(EXE_ALL_ON_MEM);
EXE_ALL_ON_MEM	:=	EXE_ALL_ON;

EXE_ALL_OFF_TRG	:=	EXE_ALL_OFF AND NOT(EXE_ALL_OFF_MEM);
EXE_ALL_OFF_MEM	:=	EXE_ALL_OFF;



	IF EXE_ALL_ON_TRG THEN

		演算中3 := TRUE;
		FOR M1 := 0 TO ( MATRIX_X * MATRIX_Y ) BY 1 DO

		配列[M1].POINT_USE := TRUE;
		配列[M1].ITEM1_USE := TRUE;
		配列[M1].ITEM2_USE := TRUE;

		END_FOR;
		ELSE 演算中3 := FALSE;

	END_IF;


	IF EXE_ALL_OFF_TRG THEN

		演算中4 := TRUE;
		FOR M2 := 0 TO ( MATRIX_X * MATRIX_Y ) BY 1 DO

		 配列[M2].POINT_USE := FALSE;
		 配列[M2].ITEM1_USE := FALSE;
		 配列[M2].ITEM2_USE := FALSE;

		END_FOR;
		ELSE 演算中4 := FALSE;

	END_IF;

(*--------------------------------------------------------------------*)



(*--------全ビットデータをオン/オフする--------------------------*)

EXE_ALL_VEL_TRG	:=	EXE_ALL_VEL AND NOT(EXE_ALL_VEL_MEM);
EXE_ALL_VEL_MEM	:=	EXE_ALL_VEL;


	IF EXE_ALL_VEL_TRG THEN

		演算中5 := TRUE;
		FOR M3 := 0 TO ( MATRIX_X * MATRIX_Y ) BY 1 DO

		配列[M3].MOV_VEL := MV_VEL;


		END_FOR;
		ELSE 演算中5 := FALSE;

	END_IF;







(*--------------------------------------------------------------------------*)
(*実行中フラグまとめ*)
(*  PLCのサイクリックスキャン用の表現につき注意   *)


	演算中 := 演算中1 OR 演算中2 OR 演算中3 OR 演算中4 OR 演算中5;





FB化で使用します

コメント

タイトルとURLをコピーしました