ラダー→CプログラムOUT命令

PLCのプログラムでは大きく分けて以下のような構造になります。

・起動後初期化処理(setup関数)
・マイスキャンの処理(loop関数)
入力の更新処理
 出力の更新処理
 ラダープログラムの処理

この内容に従い、以下のラダーをC言語のプログラムを
作成しました。

// 入力デバイスに関する設定部
#define X0021    (0x01 << 0) 
#define X0022    (0x01 << 1) 
#define X0034    (0x01 << 2) 
#define X0035    (0x01 << 3) 

#define   GET_X(DEVICE,NO)   (in_data & DEVICE)

byte in_no[] = { 21 , 22 , 34 , 35}; 
unsigned long in_data ;  // 入力Xの保持変数(32点数分)

// 出力デバイスに関する設定部
#define Y0018    (0x01 << 0) 
#define Y0019    (0x01 << 1) 
#define Y0025    (0x01 << 2) 
#define Y0026    (0x01 << 3) 

#define GET_Y(DEVICE,NO)   (out_data & DEVICE)
#define SET_Y_ON(DEVICE,NO)    out_data = out_data | DEVICE
#define SET_Y_OFF(DEVICE,NO)   out_data = out_data & ~DEVICE

byte out_no[] = { 18 , 19 , 25 , 26}; 
unsigned long out_data ;  // 出力Yの保持変数(32点数分)


// Arduino 起動時呼び出しプログラム
void setup(){
   for (byte i=0; i<sizeof(in_no); i++) {
     pinMode(in_no[i],INPUT);
   }
   for (byte i=0; i<sizeof(out_no); i++) {
     pinMode(out_no[i],OUTPUT);
   } 
}

// Arduino 繰り返しプログラム
void loop(){
  output_update();
  input_update();

////////////////////////
// スキャンプログラム //
////////////////////////

 
  if (GET_X(X0021,21)){
    SET_Y_ON(Y0019,19);
  } else {
    SET_Y_OFF(Y0019,19);    
  }

  if (GET_X(X0022,22)){
    SET_Y_ON(Y0025,25);
  } else {
    SET_Y_OFF(Y0025,25);    
  }

////////////////////////

  output_update();
}

// standard function
// 入力情報の更新関数
void input_update() {
   in_data = 0;
   for (byte i=0; i<sizeof(in_no); i++) { 
     if (digitalRead(in_no[i])==LOW) { 
       in_data = in_data & ~(0x01 << i);
     } else { 
       in_data = in_data | (0x01 << i);
     }
   }
} 

// 出力情報の更新関数
void output_update() {
   for (byte i=0; i<sizeof( out_no ); i++) { 
     if ( out_data & (0x01 << i) ) {
       digitalWrite( out_no[i], HIGH );
     } else {
       digitalWrite( out_no[i] , LOW );
     }
   }
}

こちらのプログラム長いですね。
入出力のプログラムはシステム部分です。
本来のラダー部は以下の部分です。

  if (GET_X(X0021,21)){
    SET_Y_ON(Y0019,19);
  } else {
    SET_Y_OFF(Y0019,19);    
  }

  if (GET_X(X0022,22)){
    SET_Y_ON(Y0025,25);
  } else {
    SET_Y_OFF(Y0025,25);    
  }