【ST言語】【構造体の配列処理】【備忘録】
25個の配列を5×5の配列で座標に割り付ける
目的:配列番号順のデータで動くプログラムの座標を生成する
【1】【2】【3】…………..【24】【25】
5X5のイメージ
21 | 22 | 23 | 24 | 25 |
16 | 17 | 18 | 19 | 20 |
11 | 12 | 13 | 14 | 15 |
6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 |
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;
コメント