Robodyn Arduino Mega w/ Eth not communicating with Acromag963en-4012 io expander

Hello all.
I am trying to connect a Robodyn Arduino Mega 2560 w Ethernet to a Acromag 963EN-4012.
I am trying to identify the Acromag so I can begin reading and writing registers.
Here is my code.

type or paste /*
  Ethernet Modbus TCP Client Toggle

  This sketch toggles the coil of a Modbus TCP server connected
  on and off every second.

  Circuit:
   - Any Arduino MKR Board
   - MKR ETH Shield

  created 16 July 2018
  by Sandeep Mistry
*/

#include <SPI.h>

#include <Ethernet.h>

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

EthernetClient ethClient;
ModbusTCPClient modbusTCPClient(ethClient);

IPAddress server(128,1,1,100); // update with the IP Address of your Modbus server

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  pinMode(7, OUTPUT );
  digitalWrite(7, HIGH);
  delay(3000);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.********************");
  }

}

void loop() {
  if(!modbusTCPClient.connected()) {
    // client not connected, start the Modbus TCP client
    Serial.println("Attempting to connect to Modbus TCP server");
    if (!modbusTCPClient.begin(server, 502)) {
      Serial.println("Modbus TCP Client failed to connect!");
    } else {
      Serial.println("Modbus TCP Client connected");
    }
  } 
  
  else {
    // client connected

    // write the value of 0x01, to the coil at address 0x00
    if (!modbusTCPClient.coilWrite(0x00, 0x01)) {
      Serial.print("Failed to write coil! ");
      Serial.println(modbusTCPClient.lastError());
    }

    // wait for 1 second
    delay(1000);

    // write the value of 0x00, to the coil at address 0x00
    if (!modbusTCPClient.coilWrite(0x00, 0x00)) {
      Serial.print("Failed to write coil! ");
      Serial.println(modbusTCPClient.lastError());
    }

    // wait for 1 second
    delay(1000);
  }
}code here

All I want to do is connect so I can begin using the Acromag.

My output to the serial monitor repeatedly writes
12:35:57.247 -> Modbus TCP Client failed to connect!
12:35:57.297 -> Attempting to connect to Modbus TCP server
12:35:58.276 -> Modbus TCP Client failed to connect!
12:35:58.276 -> Attempting to connect to Modbus TCP server
12:35:59.259 -> Modbus TCP Client failed to connect!
12:35:59.305 -> Attempting to connect to Modbus TCP server
12:36:00.288 -> Modbus TCP Client failed to connect!

Ant help would be greatly appreciated

Did you realize that the two IP addresses are in completely different networks? I don't know how your network is constructed but if you don't have an extremely odd network setup I would expect that to fail. 192.168.1.177 is in a private network while 128.1.1.100 is a publicly routed address owned by a company named Zenlayer Inc.
The Arduino Ethernet library uses a C-class network if not explicitly told otherwise, so your Arduino won't see the Acromag using this sketch.

Hey Thanks for the quick response pylon.
So I changed my arduino IP to 128.1.1.110 and the connection was successful.
Regards.

I would have changed the IP of the Acromag as you're most probably not the owner of the 128.1.1.0/24 network. Did you configure that strange IP to the Acromag?

It ships with that IP.
Unfortunately the LAN connection on my computer is not functioning.
In order to change the acromag IP, I need to plug it into my computers ethernet port.
I would then ping it with a web browser so I can change the IP.
That or I think I can Dynamically change it .
But right now my setup is Arduino->acromag. With just an ethernet crossover cable between them.

I will change it asap

In this case I must strongly advise against that device. A manufacturer doing such a no-go should go out of business immediately.

Just out of Curiosity. Why is the 128 ip a no no pylon?

That's a publicly routable address, it's owned by someone and traffic on the internet is routed to there. Of course you can use any address in your private LAN, but for private use 3 big blocks of addresses are reserved so there's no need to use someone else's addresses and risk that by a slight misconfiguration of the router false traffic is routed there (and might be misinterpreted as an attack).

Hey Pylon. First off, thanks for your help.
With your help and some rudimentary testing, I have most of the Acromags working.
I am still having problems with the Analog outputs but it may just be because of
either how I am measuring the output or wrong addressing. I will continue to sort that stuff out.
My code is below if it helps anyone else implementing this stuff. Its "barebones" but will get it working. except the analog outputs.

NOTE: This configuration is for LAN only. DO NOT use ip 128.1.1.100 if on the internet. Change the ip in configuration of acromag either by setting registers or the ethernet configuration.


#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(128, 1, 1, 110); //needs to be a similar mask b/c will not connect
//IPAddress ip(192 , 168, 1, 110);

EthernetClient ethClient;
ModbusTCPClient modbusTCPClient(ethClient);

IPAddress server(128,1,1,100); // update with the IP Address of your Modbus server
//IPAddress server(192,168,1,100);

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  
  pinMode(7, OUTPUT );
  digitalWrite(7, HIGH);//reseting ethernet wiznet5500
  delay(3000);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.********************");
  }

}

void loop() {
  if(!modbusTCPClient.connected()) {
    // client not connected, start the Modbus TCP client
    Serial.println("Attempting to connect to Modbus TCP server");
    if (!modbusTCPClient.begin(server, 502)) {
      Serial.println("Modbus TCP Client failed to connect!");
    } else {
      Serial.println("Modbus TCP Client connected");
    }
  } 
  
  else {

   
    /*
    //Acromag 963EN-4012 Analog input
    //Notes: Need to mess with the scaling
      Serial.println(modbusTCPClient.holdingRegisterRead(3016));//ref:43016 read Channel 0
      Serial.println(modbusTCPClient.holdingRegisterRead(3017));//ref:43017 read Channel 1
      Serial.println(modbucTCPClient.holdingRegister(3028));//ref:43028 read Channel 11
      */
 /*-------------Needs Attention----------------------
    //Acromag 973EN-4006 Analog Outputs six channel
    modbusTCPClient.holdingRegisterWrite(6,0x0000);//WD timeout
    modbusTCPClient.holdingRegisterWrite(11,10000);// write slave id 2, channel 0, 5volts
    Serial.println(modbusTCPClient.lastError());
    delay(5000);
    modbusTCPClient.holdingRegisterWrite(11,0);//write slave id 2, channel 0, 0volts
    Serial.println(modbusTCPClient.lastError());
    delay(5000);
    
   // -------------needs Attention-------------------------
*/
  /*
    //Acromag 989EN-4016 DIO with event counters
    //Note - Have to do binary addition to for 16 bits ie 0000001 is CH0 on
    modbusTCPClient.holdingRegisterWrite(39,0x01); //ch0 on
    //modbusTCPClient.holdingRegisterWrite(39,0x02); //ch2 on
    Serial.println(modbusTCPClient.lastError());
    delay(3000);
    modbusTCPClient.holdingRegisterWrite(39,0x00); //ch0 off
    Serial.println(modbusTCPClient.lastError());
    delay(3000);
    */

  /*
    //Acromag965EN-4006 six T/C or mv Inputs 1V peak
      Serial.println(modbusTCPClient.holdingRegisterRead(3012));//T/C analog input 0 Room Temp ~270 units
      Serial.println(modbusTCPClient.lastError());//for troubleshooting
      Serial.println(modbusTCPClient.holdingRegisterRead(3013));//
     // Serial.println(modbucTCPClient.holdingRegisterRead(3028));//
  */

   //Acromag952EN-4012DIO and AIO
      Serial.println(modbusTCPClient.holdingRegisterRead(103));//Read Analog Input A0
      modbusTCPClient.holdingRegisterWrite(100,20000);//reads ~14vdc so close(24/2=12) but does not turn off???
      modbusTCPClient.holdingRegisterWrite(102,63);//Digital Outputs On 11111
      Serial.println(modbusTCPClient.lastError());
      delay(3000);
      modbusTCPClient.holdingRegisterWrite(100,0);
      modbusTCPClient.holdingRegisterWrite(102,0);//All digitals outputs off 00000
      delay(3000);
    
  
 
  }
}

Current Status

//this is for pcb revision3 with acromags
//Had to change some of the digital outputs for the new PCB
//

//need to figure out digital inputs for the
//green amber and estop buttons.
//As far as the BMM.ALARM and BMM.POF,
//These can be read on the OCI417.10

#include<SPI.h>
#include<Ethernet.h>


#include<ArduinoModbus.h>
#include<ModbusMaster.h>
#include<EEPROM.h>
#include<pid.h>

//For OCI417 module
#define MAX485_DE 12
#define MAX485_RE_NEG 13

//ECU jibber jabber
#define ESTOP_BREAK 40
#define LED_PWR 22
#define TRACO_24VDC 23

//TIMING PARAMETERS
unsigned long LOOP_TIME;
unsigned long CURRENT_MILLIS=0;//used to keep track of time
unsigned long PREVIOUS_MILLIS=0;//used to keep track of time
unsigned long PREVIOUS_MILLIS_1=0;//used in case 8
unsigned long PREVIOUS_MILLIS_2=0;//used in case 7
unsigned long PREVIOUS_MILLIS_3=0;//used in readTCs function
unsigned long LOOP_MILLIS=0;//used to caluclate loop function time.
//timing constants
const long SUPERHEAT_TIMER=50000;
const int BMM_OFF_TIMER=30000;
const int BMM_START_TIMER=5000;
const int BMM_PURGE_TIMER=32000;
const long BMM_IGNITION_TIMER=30000;
const long BURNER_RAMP_TIMER=240000;//4mins
const long BURNER_REACH_815C=1200000;//SECONDS//20mins
const long STEAM_GENERATION_TIMER=1800000;//30 mins
const int STEAM_AT_170PSI_TIMER=10000;//gwrgw
const int OPEN_SR_FUEL_TIMER=180000;//3 mins

//superheat delta constant PARAMETERS
const int SUPERHEAT_DELTA_CONSTANT=0.3;// ~3degreesC per 10ms
uint16_t PREVIOUS_TT407=0,PREVIOUS_TT408=0;

//counter
uint8_t TC_CHECK_COUNTER=1;

//BLOWER VARIABLES
const int BLOWER_PURGE_SPEED=4, BLOWER_IGNITION_SPEED=3407,BLOWER_RAMP_END=7150;//2 to keep the dps triggered .17 * 20043counts
uint16_t BLOWER_SPEED_AT_170PSI,BLOWER_SPEED_FEEDBACK=0,BLOWER_CALCULATE_SPEED;//feedback in counts
bool BLOWER_ENABLE=false;

//RO PUMP VARIABLES
const int MAX_RO_PRESSURE=250;//psi
const int RO_PUMP_AT_10_GRAMS_PER_SEC=2500;//counts
uint8_t RO_PUMP_SPEED_COMMANDED=0,RO_PUMP_FEEDBACK=0;
bool RO_PUMP_ENABLE=false;

//FLOW CONTROL VALVES
uint8_t FCV205_HX406_INLET_FLOW=0;//g/sec
uint16_t FCV134_BURNER_FUEL_FLOW_FB;//counts
const int FCV134_BURNER_FUEL_FLOW_IGNITION=10079,FCV134_BURNER_FUEL_FLOW_RAMP_END=15320;//5 volts ~40 percent open
uint8_t FCV141_SR_FEED_FLOW=0;//PERCENTAGE
uint8_t FT132_NG_FEED_FLOW=0; // UNSURE OF UNITS??
bool TWV308_STEAM_REFORMER_FEED=false;//NEED TO DETERMINE DIRECTIONS
bool TWV901_LOW_PRESSURE_REFORMATE=false;//NEED TO DETERMINE SIRECTIONS

uint8_t ATMOSPHERIC_PRESSURE=5;//psi

//INITIALIZE PRESSURE TRANSDUCER VARIABLES
uint16_t PT213_RO_PRESSURE,PT318_HX406_OUTPUT_PRESSURE;//psi
uint16_t PT420_STEAM_EJECTOR_PRESSURE,PT304_TWV308_INPUT_PRESSURE;//psi

//INITIALIZE THERMOCOUPLE VARIABLES
uint16_t TT142_SR_FUEL,TT301_HX406_STEAM_OUT,TT303_HX504_STEAM_OUT,TT306_EJECTOR_STEAM_IN;
uint16_t TT313_HX402_STEAM_OUT,TT319_HX402_STEAM_SYSTEM,TT407_STEAM_REFORMER_OUT_LREF;
uint16_t TT408_HTS_IN_LREF,TT410_HTS_OUT_LREF,TT411_FPZ_OUT_LREF,TT430_SMR_TUBES_INLET;
uint16_t TT511_SILICON_CARBIDE_OUT,TT512_SILICON_CARBIDE_OUT,TT513_HX504_IN,TT514_HX504_OUT;
uint16_t TT441_SMR_TUBE1_OUT,TT442_SMR_TUBE2_OUT,TT443_SMR_TUBE3_OUT,TT444_SMR_TUBE4_OUT;
uint16_t TT445_SMR_TUBE5_OUT,TT446_SMR_TUBE6_OUT,TT447_SMR_TUBE7_OUT,TT448_SMR_TUBE8_OUT;
uint16_t TT449_SMR_TUBE9_OUT;
unit16_t HOLD_BURNER_TEMP;

//OCI417 MODBUS PARAMETERS
const int OCI_INPUT_STATUS_REGISTER=25;
const int OCI_OUTPUT_STATUS_REGISTER=26;
const int OCI_UNIT_ID=1;
uint16_t OCI_INPUT_STATUS_WORD=0;
uint16_t OCI_OUTPUT_STATUS_WORD=0;
uint8_t OCI_RESULT;
bool COMBUSTION_PRESSURE_SWITCH,BMM_ALARM_STATUS;
bool BMM_PROOF_OF_FLAME,OCI_TO_BMM_COM;
bool DUN_PSH,DUN_PSL,DUN_ZSL;
ModbusMaster NODE;

//FLAGS
bool GRN_BTN_FLAG=false,AMB_BTN_FLAG=false,ESTOP_FLAG=false,SENSOR_INTEGRITY_CHECK=false;
bool WATCHDOG_TIMER_FLAG=false;
bool PSI_INIT_TIMER=false;

uint8_t FSM_STATE=0;

uint8_t ERROR=0;//ERROR 0 means no ERROR.

//Mac Address of controller
byte mac[] = {0xdE,0xAD,0xBE,0xEF,0xED};
//needs to be similar to Acromag because will not connect
IPAddress ip(128,1,1,110);

//PARAMETERS FOR ACROMAG SERVERS
EthernetClient ethClient1;
EthernetClient ethClient2;
EthernetClient ethClient3;
EthernetClient ethClient4;
EthernetClient ethClient5;
EthernetClient ethClient6;
EthernetClient ethClient7;

ModbusTCPClient modbusTCPClient1(ethClient1);
ModbusTCPClient modbusTCPClient2(ethClient2);
ModbusTCPClient modbusTCPClient3(ethClient3);
ModbusTCPClient modbusTCPClient4(ethClient4);
ModbusTCPClient modbusTCPClient5(ethClient5);
ModbusTCPClient modbusTCPClient6(ethClient6);
ModbusTCPClient modbusTCPClient7(ethClient7);

IPAddress serverA1(128,1,1,101); // IP of Acromag1 973EN-4006 analog output
IPAddress serverA2(128,1,1,102); // IP of Acromag2 963EN-4012 analog input
IPAddress serverA3(128,1,1,103); // IP of Acromag3 989EN-4016 digital output
IPAddress serverA4(128,1,1,104); // IP of Acromag4 965EN-4006 tc
IPAddress serverA5(128,1,1,105); // IP of Acromag5 965EN-4006 tc
IPAddress serverA6(128,1,1,106); // IP of Acromag6 965EN-4006 tc
IPAddress serverA7(128,1,1,107); // IP of Acromag7 965EN-4006 tc

//PIDs
//steam gen pid
PID Steam_Gen_PID = PID(0.1, 1, -1, 0.5, 0.01, 0.5);//dt,max,min,kp,kd,ki;//
PID OPEN_SR_FUEL_PID = PID(0.1, 1000, -1000, 0.5, 0.01, 0.5);//dt,max,min,kp,kd,ki;//
uint8_t BLOWER_SPEED_OFFSET;
uint16_t BURNER_FUEL_CUT_OFFSET, BURNER_FUEL_CUT;//for pid in case 9 open sr fuel also case 10

void setup() {

  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);

  // Init in receive mode rs485
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  Serial.begin(9600); // for dedbugging

  Serial1.begin(9600);//FOR OCI MODULE rs485
  NODE.begin(1, Serial1); //unit id1 on serial1
  NODE.preTransmission(preTransmission);
  NODE.postTransmission(postTransmission);

  delay(500);//wait for system to boot up

  pinMode(LED_PWR,OUTPUT);
  digitalWrite(LED_PWR,HIGH);
  pinMode(TRACO_24VDC,OUTPUT);
  digitalWrite(TRACO_24VDC,HIGH);
  pinMode(ESTOP_BREAK,OUTPUT);
  digitalWrite(ESTOP_BREAK,HIGH);

  //reseting wifichip
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);
  delay(50);

  //start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  //CONNECT TO ACROMAGS
  while(!modbusTCPClient1.connected()){modbusTCPClient1.begin(serverA1,502);}
  while(!modbusTCPClient2.connected()){modbusTCPClient2.begin(serverA2,502);}
  while(!modbusTCPClient3.connected()){modbusTCPClient3.begin(serverA3,502);}
  while(!modbusTCPClient4.connected()){modbusTCPClient4.begin(serverA4,502);}
  while(!modbusTCPClient5.connected()){modbusTCPClient5.begin(serverA5,502);}
  while(!modbusTCPClient6.connected()){modbusTCPClient6.begin(serverA6,502);}
  while(!modbusTCPClient7.connected()){modbusTCPClient7.begin(serverA7,502);}

  readBtn();
  readOCI();
  integrityCheck();

  modbusTCPClient1.holdingRegisterWrite(0x12,(0));//write channel 0 (BLWRSpeed) off

  //get that dang dynamic pressure switch off!!
  BLOWER_SPEED_FEEDBACK=modbusTCPClient2.holdingRegisterRead(3016)*(.0005);//10volts/20000counts
  while(BLOWER_SPEED_FEEDBACK>0){
    BLOWER_SPEED_FEEDBACK=modbusTCPClient2.holdingRegisterRead(3016)*(.0005);//10volts/20000counts
    delay(1);
    }

    CURRENT_MILLIS=millis();//So as to not divide by zero on first looptime.
    LOOP_MILLIS=millis();
}

void loop() {

  LOOP_TIME=LOOP_MILLIS-CURRENT_MILLIS;
  connect_IO_Expanders();
  superheatTest();
  CURRENT_MILLIS=millis();

  Serial.println(FSM_STATE);//debugging
  Serial.print("Error:");Serial.println(ERROR);//debugging

  readTCs();
  readBtn();
  readOCI();
  readPTs();

  if(!SENSOR_INTEGRITY_CHECK){integrityCheck();}
  if(DUN_PSL){readOCI();}
connect_IO_Expanders();
switch(FSM_STATE){



 case 0: //initialize
  Serial.println("In case 0");
  if(!SENSOR_INTEGRITY_CHECK){break;}
  modbusTCPClient3.coilWrite(4,255);//CH4 digital output xv909

 if(!COMBUSTION_PRESSURE_SWITCH){
  modbusTCPClient1.holdingRegisterWrite(0x12,(BLOWER_PURGE_SPEED*2000));//write channel 0 (BLWRSpeed)
  modbusTCPClient3.coilWrite(13,0);//BLWR_EN..The logic is opposite
  break;}

 if(!DUN_PSL){Serial.print("Break due to DUN_PSL Switch: ");Serial.println(DUN_PSL);break;}

 //check for RO water???
 modbusTCPClient1.holdingRegisterWrite(0x12,OFF);//write channel 0 (BLWRSpeed)
 modbusTCPClient3.coilWrite(13,255);//BLWR_EN..The logic is opposite
 FSM_STATE=1;break;

 case 1: //depressurise reformer
 Serial.println("In case 1");
  modbusTCPClient3.coilWrite(8,OFF);//TWV308

  if(PT420_STEAM_EJECTOR_PRESSURE >= ATMOSPHERIC_PRESSURE){

    PT420_STEAM_EJECTOR_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3022)*(.0125))-47;//ref:43016 read Channel 6 PT420
    // PT420_STEAM_EJECTOR_PRESSURE = modbusTCPClient2.holdingRegisterRead(3022);
    modbusTCPClient3.coilWrite(4,255);//CH4 digital output xv909

    break;
  }

  modbusTCPClient3.coilWrite(4,OFF);//CH4 digital output xv909

  //250 psi
  if(PT213_RO_PRESSURE<250){

   //just guessing on the fcv205 flow, as long as we stay beneath 250psi
   modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_PURGE_SPEED*2000);//write channel 0 (BLWRSpeed)
   modbusTCPClient1.holdingRegisterWrite(0x15,7000);//write channel 3 (FCV205)//made steam at 1000//last 3000//~about 35 percent according to Shawn
   modbusTCPClient1.holdingRegisterWrite(0x13,RO_PUMP_AT_10_GRAMS_PER_SEC);//write channel 1 (WP_Speed) made steam at 1*2000//last 3*2000
   modbusTCPClient3.coilWrite(14,OFF);//WP_EN..Control is opposite
   modbusTCPClient3.coilWrite(13,OFF);//BLWR_EN..Control is opposite
   FSM_STATE=2;
   PREVIOUS_MILLIS=millis();
   break;
  }

 case 2://Superheat Test
 Serial.println("case 2");
  //make sure we are closed//xv909
  modbusTCPClient3.coilWrite(4,OFF);//CH4 digital output xv909
  //monitor tc 407 & 408
  //need a timer

  if(CURRENT_MILLIS - PREVIOUS_MILLIS <= SUPERHEAT_TIMER){

    TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);
    TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);
    //guessing on 300 degrees centigrade
    if(TT407_STEAM_REFORMER_OUT_LREF >300){
      ERROR=7;FSM_STATE=0;break;
      }
    if(TT408_HTS_IN_LREF>300){
      ERROR=7;FSM_STATE=0;break;
      }
    break;
   }
   FSM_STATE=3;
   PREVIOUS_MILLIS = millis();
   break;

  case 3://bmm off //30 secondsconnect_IO_Expanders();
  Serial.println("case 3");

  if(CURRENT_MILLIS - PREVIOUS_MILLIS <= BMM_OFF_TIMER){

    modbusTCPClient1.holdingRegisterWrite(0x12,OFF);//write channel 0 (BLWRSpeed)
    modbusTCPClient3.coilWrite(12,OFF);//BMM_CR2 bmm off
    break;
   }
  FSM_STATE=4;
  PREVIOUS_MILLIS = millis();
  modbusTCPClient3.coilWrite(12,255);//BMM_CR2 turn on
  break;

  case 4://bmm on //5 seconds
  Serial.println("Case 4");

  if(CURRENT_MILLIS - PREVIOUS_MILLIS <= BMM_START_TIMER){
   break;
   }
  PREVIOUS_MILLIS = millis();
  FSM_STATE=5;
  break;

  case 5://bmm purge
  Serial.println("Case 5");

  if(CURRENT_MILLIS - PREVIOUS_MILLIS <= BMM_PURGE_TIMER){

   modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_PURGE_SPEED*2000);//write channel 0 (BLWRSpeed)
   break;
   }
  PREVIOUS_MILLIS = millis();
  FSM_STATE=6;
  break;

  case 6://BMM ignition
  Serial.println("Case 6");


  modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_IGNITION_SPEED);//write channel 0 (BLWRSpeed)
  modbusTCPClient1.holdingRegisterWrite(0x14,FCV134_BURNER_FUEL_FLOW_IGNITION);//write channel 2 (FCV134)

  if(CURRENT_MILLIS - PREVIOUS_MILLIS >= BMM_IGNITION_TIMER){

  if(!BMM_PROOF_OF_FLAME){ERROR=8;FSM_STATE=0;break;}
  else{FSM_STATE=7;PREVIOUS_MILLIS=millis();PREVIOUS_MILLIS_2=millis();break;}

  }
  break;

  case 7://start burner ramp//15 minutes//900 seconds
  Serial.println("Case 7");
  //burner ramp is 4mins
  //timing to reach 800c is 15 mins

  TT511_SILICON_CARBIDE_OUT=(modbusTCPClient5.holdingRegisterRead(3017))*(0.07);
  TT513_HX504_IN=(modbusTCPClient6.holdingRegisterRead(3013))*(0.07);

  Serial.print("TT511: ");Serial.println(TT511_SILICON_CARBIDE_OUT);
  Serial.print("TT513: ");Serial.println(TT513_HX504_IN);
  Serial.print("Burner Ramp Timer 15 mins: ");Serial.println(CURRENT_MILLIS - PREVIOUS_MILLIS);

  if(CURRENT_MILLIS - PREVIOUS_MILLIS >= BURNER_REACH_815C){

   if(TT511_SILICON_CARBIDE_OUT >= 815){
    FSM_STATE=8;
    PREVIOUS_MILLIS = millis();
    break;
    }

   if( TT513_HX504_IN >= 815){
    FSM_STATE=8;
    PREVIOUS_MILLIS = millis();
    break;
    }

   ERROR=11;FSM_STATE=0;break;
   }

   if(TT511_SILICON_CARBIDE_OUT >= 815  ){
    FSM_STATE=8;
    PREVIOUS_MILLIS = millis();
    break;
    }

   if( TT513_HX504_IN >= 815){
    FSM_STATE=8;
    PREVIOUS_MILLIS = millis();
    break;
    }

   BLOWER_SPEED_FEEDBACK = modbusTCPClient2.holdingRegisterRead(3016);//10volts/20000counts //~3400
   FCV134_BURNER_FUEL_FLOW_FB = modbusTCPClient2.holdingRegisterRead(3026);//ref:43028 read Channel 10 FCV134//~10079

   Serial.print("Blower FB: ");Serial.println(BLOWER_SPEED_FEEDBACK);
   Serial.print("FCV134 FB: ");Serial.println(FCV134_BURNER_FUEL_FLOW_FB);

   if(CURRENT_MILLIS - PREVIOUS_MILLIS <= BURNER_RAMP_TIMER){

    if(CURRENT_MILLIS - PREVIOUS_MILLIS_2 >= 5000){

    //if(BLOWER_SPEED_FEEDBACK<=14030){
    //modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_SPEED_FEEDBACK+220);}//write channel 0 blwr speed//44counts/sec
    //if(FCV134_BURNER_FUEL_FLOW_FB<=16121){
    //modbusTCPClient1.holdingRegisterWrite(0x14,FCV134_BURNER_FUEL_FLOW_FB+125);}//25counts/sec

     modbusTCPClient1.holdingRegisterWrite(0x14,FCV134_BURNER_FUEL_FLOW_RAMP_END);//16121 best thus far, fuel
     modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_RAMP_END);//7100 best thus far, blwr
     PREVIOUS_MILLIS_2 = millis();
     break;
     }
   }
   else{
  //modbusTCPClient1.holdingRegisterWrite(0x14,16121);//25counts/sec
  //modbusTCPClient1.holdingRegisterWrite(0x12,13000);//write channel 0 blwr speed//44counts/sec
    break;
    }
   break;

  case 8://Steam generation
  Serial.println("Case 8");

  //steam gen timeout 30 mins
  if(CURRENT_MILLIS - PREVIOUS_MILLIS >= STEAM_GENERATION_TIMER){ERROR=9;FSM_STATE=0;break;}

  Serial.print("Elapsed Time(time 1800ms): ");Serial.println(CURRENT_MILLIS - PREVIOUS_MILLIS);
  //PID control blower to acheive 170PSI pt304
  BLOWER_SPEED_FEEDBACK=modbusTCPClient2.holdingRegisterRead(3016);//10volts/20000counts

  if(BLOWER_SPEED_FEEDBACK<16000){

  BLOWER_SPEED_OFFSET = Steam_Gen_PID.calculate(170 , PT304_TWV308_INPUT_PRESSURE);
  BLOWER_CALCULATE_SPEED = BLOWER_SPEED_FEEDBACK + BLOWER_SPEED_OFFSET;
  modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_CALCULATE_SPEED);}//write channel 0 (BLWRSpeed)

  if(PT304_TWV308_INPUT_PRESSURE <= 171 && PT304_TWV308_INPUT_PRESSURE >= 169){
  if(PSI_INIT_TIMER == false){ PREVIOUS_MILLIS_1 = millis(); PSI_INIT_TIMER = true; }
  if(CURRENT_MILLIS - PREVIOUS_MILLIS_1 >= STEAM_AT_170PSI_TIMER){
   BLOWER_SPEED_AT_170PSI=BLOWER_SPEED_FEEDBACK;
   modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_SPEED_AT_170PSI*2000);
   modbusTCPClient3.coilWrite(5,255);//XV501 ON
   FSM_STATE=9; PREVIOUS_MILLIS = millis(); PSI_INIT_TIMER=false; =TT513_HX504_IN; break;
  }
 }
 else{PSI_INIT_TIMER=false;}//If not in bounds of 17-psi, reset timer.
 break;

 case 9://OPEN SR FUEL
 Serial.println("Case 9:");

 modbusTCPClient3.coilWrite(9,255);//TWV308 ON//channeling right when in front of refromer r050
 modbusTCPClient1.holdingRegisterWrite(0x15,10000);//write channel 3 (FCV205)//50 percent

 FCV134_BURNER_FUEL_FLOW_FB = (modbusTCPClient2.holdingRegisterRead(3026)*(.005))-20;//ref:43028 read Channel 10 FCV134

 if(CURRENT_MILLIS-PREVIOUS_MILLIS<=180000){

 BURNER_FUEL_CUT_OFFSET = OPEN_SR_FUEL_PID.calculate(HOLD_BURNER_TEMP , TT513_HX504_IN);
 BURNER_FUEL_CUT= FCV134_BURNER_FUEL_FLOW_FB + BURNER_FUEL_CUT_OFFSET;
 modbusTCPClient1.holdingRegisterWrite(0x14, BURNER_FUEL_CUT);//write channel 2 (FCV134)

//reset timing if temp falls out of threshold
 if((HOLD_BURNER_TEMP>(TT513_HX504_IN+5)) || (HOLD_BURNER_TEMP<(TT513_HX504_IN-5))){PREVIOUS_MILLIS=millis();break;}

 }

 else{
   if(ERROR==0){FSM_STATE=10;PREVIOUS_MILLIS=millis();break;}
   FSM_STATE=9; PREVIOUS_MILLIS=millis();break;
 }

 break;

 case 10://idle hold mode blower/burner pid
 Serial.println("Case 10:");
 BLOWER_SPEED_FEEDBACK = modbusTCPClient2.holdingRegisterRead(3016);//10volts/20000counts
 FCV134_BURNER_FUEL_FLOW_FB = (modbusTCPClient2.holdingRegisterRead(3026)*(.005))-20;//ref:43028 read Channel 10 FCV134

 //3 mins idle
 if(CURRENT_MILLIS-PREVIOUS_MILLIS<=180000){

//burner fuel PID
 BURNER_FUEL_CUT_OFFSET = OPEN_SR_FUEL_PID.calculate(HOLD_BURNER_TEMP , TT513_HX504_IN);
 BURNER_FUEL_CUT= FCV134_BURNER_FUEL_FLOW_FB + BURNER_FUEL_CUT_OFFSET;
 modbusTCPClient1.holdingRegisterWrite(0x14, BURNER_FUEL_CUT);//write channel 2 (FCV134)

 //blower pid
 BLOWER_SPEED_OFFSET = Steam_Gen_PID.calculate(170 , PT304_TWV308_INPUT_PRESSURE);
 BLOWER_CALCULATE_SPEED = BLOWER_SPEED_FEEDBACK + BLOWER_SPEED_OFFSET;
 modbusTCPClient1.holdingRegisterWrite(0x12,BLOWER_CALCULATE_SPEED);//write channel 0 (BLWRSpeed)

 //check if out of threshold
 if((HOLD_BURNER_TEMP>(TT513_HX504_IN+5)) || (HOLD_BURNER_TEMP<(TT513_HX504_IN-5))){PREVIOUS_MILLIS=millis();break;}
 if(PT304_TWV308_INPUT_PRESSURE <= 171 && PT304_TWV308_INPUT_PRESSURE >= 169){PREVIOUS_MILLIS=millis();break;}

 }
 else{FSM_STATE=11;break;}
 break;

 case 11://reformer stabilize
 Serial.println("Case 11:");
 

 default:
 Serial.println("Default.");
 break;

}//end switch

LOOP_MILLIS = millis();
}//end loop

void superheatTest(){

  int DELTA_TT407,DELTA_TT408;

  //These dont seem to be changing enough
  PREVIOUS_TT407=TT407_STEAM_REFORMER_OUT_LREF;
  PREVIOUS_TT408=TT408_HTS_IN_LREF;


  if  (!modbusTCPClient5.connected()){modbusTCPClient5.begin(serverA5,502);Serial.println("Connecting to A5 for superheat test.");}
  TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);//current temp tt408
  TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);//current temp tt408

  DELTA_TT407 = (TT407_STEAM_REFORMER_OUT_LREF - PREVIOUS_TT407)/(LOOP_TIME);
  DELTA_TT408 = (TT408_HTS_IN_LREF - PREVIOUS_TT408)/(LOOP_TIME);



  Serial.print("CURRENT_TT407: ");Serial.println(TT407_STEAM_REFORMER_OUT_LREF);
  Serial.print("PREVIOUS_TT407: ");Serial.println(PREVIOUS_TT407);
  Serial.print("CURRENT_TT408: ");Serial.println(TT408_HTS_IN_LREF);
  Serial.print("PREVIOUS_TT408: ");Serial.println(PREVIOUS_TT408);
  Serial.print("CURRENT_MILLIS: ");Serial.println(CURRENT_MILLIS);
  Serial.print("LOOP_MILLIS: ");Serial.println(LOOP_MILLIS);
  Serial.print("LOOP TIME: ");Serial.println(LOOP_TIME);
  Serial.print("DELTA_TT407: ");Serial.println(DELTA_TT407);//debugging
  Serial.print("DELTA_TT408: ");Serial.println(DELTA_TT408);//debugging

  if(DELTA_TT407 > SUPERHEAT_DELTA_CONSTANT || DELTA_TT408 > SUPERHEAT_DELTA_CONSTANT){
    modbusTCPClient1.holdingRegisterWrite(0x13,20000);//write channel 1 (WP_Speed) full speed ahead sire
    modbusTCPClient3.coilWrite(14,OFF);//WP_EN..Control is opposite
  }

  else{
    modbusTCPClient1.holdingRegisterWrite(0x13,RO_PUMP_AT_10_GRAMS_PER_SEC);//write channel 1 (WP_Speed) full speed ahead sire
    modbusTCPClient3.coilWrite(14,OFF);//WP_EN..Control is opposite
  }

}

void connect_IO_Expanders(){
  //CONNECT TO ACROMAGS
  if(!modbusTCPClient1.connected()){modbusTCPClient1.begin(serverA1,502);}
  if(!modbusTCPClient2.connected()){modbusTCPClient2.begin(serverA2,502);}
  if(!modbusTCPClient3.connected()){modbusTCPClient3.begin(serverA3,502);}
  if(!modbusTCPClient4.connected()){modbusTCPClient4.begin(serverA4,502);}
  if(!modbusTCPClient5.connected()){modbusTCPClient5.begin(serverA5,502);}
  if(!modbusTCPClient6.connected()){modbusTCPClient6.begin(serverA6,502);}
  if(!modbusTCPClient7.connected()){modbusTCPClient7.begin(serverA7,502);}
}

void readPTs() {
  Serial.println("Reading PTs");
 if(!modbusTCPClient2.connected()){modbusTCPClient2.begin(serverA2,502);}
 //checking PTs
PT318_HX406_OUTPUT_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3020)*(.0125))-50;//ref:43017 read Channel 4 PressureTransducer_318.. 1psi/80counts maximux
PT213_RO_PRESSURE =100; //(modbusTCPClient2.holdingRegisterRead(3021)*(.0125))-50;//ref:43028 read Channel 5 PT213
PT420_STEAM_EJECTOR_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3022)*(.0125))-47;//ref:43016 read Channel 6 PT420
PT304_TWV308_INPUT_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3023)*(.0125))-50;//ref:43017 read Channel 7 PT304

//raw data
//PT318_HX406_OUTPUT_PRESSURE = modbusTCPClient2.holdingRegisterRead(3020);
//PT213_RO_PRESSURE = modbusTCPClient2.holdingRegisterRead(3021);
//PT420_STEAM_EJECTOR_PRESSURE = modbusTCPClient2.holdingRegisterRead(3022);
//PT304_TWV308_INPUT_PRESSURE = modbusTCPClient2.holdingRegisterRead(3023);

Serial.print("PT318: ");Serial.println(PT318_HX406_OUTPUT_PRESSURE);
Serial.print("PT213: ");Serial.println(PT213_RO_PRESSURE);
Serial.print("PT420: ");Serial.println(PT420_STEAM_EJECTOR_PRESSURE);
Serial.print("PT304: ");Serial.println(PT304_TWV308_INPUT_PRESSURE);

if(PT318_HX406_OUTPUT_PRESSURE>=240){FSM_STATE=0;ERROR=3;Serial.print("PT318 >240PSI");Serial.println(PT318_HX406_OUTPUT_PRESSURE);}
else{ERROR=0;}
if(PT213_RO_PRESSURE>=240){FSM_STATE=0;ERROR=4;Serial.print("PT213 >240PSI");Serial.println(PT213_RO_PRESSURE);}
else{ERROR=0;}
if(PT420_STEAM_EJECTOR_PRESSURE>=240){FSM_STATE=0;ERROR=5;Serial.print("PT420 >240PSI");Serial.println(PT420_STEAM_EJECTOR_PRESSURE);}
else{ERROR=0;}
if(PT304_TWV308_INPUT_PRESSURE>=240){FSM_STATE=0;ERROR=6;Serial.print("PT305 >240PSI");Serial.println(PT304_TWV308_INPUT_PRESSURE);}
else{ERROR=0;}

}

void readTCs(){

 if(!modbusTCPClient4.connected()){modbusTCPClient4.begin(serverA4,502);}
 if(!modbusTCPClient5.connected()){modbusTCPClient5.begin(serverA5,502);}
 if(!modbusTCPClient6.connected()){modbusTCPClient6.begin(serverA6,502);}
 if(!modbusTCPClient7.connected()){modbusTCPClient7.begin(serverA7,502);}
 /*
 TT142_SR_FUEL=modbusTCPClient4.holdingRegisterRead(3012)*(18.4/265);
 TT301_HX406_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3013)*(18.4/265);
 TT303_HX504_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3014)*(18.4/265);
 TT306_EJECTOR_STEAM_IN=modbusTCPClient4.holdingRegisterRead(3015)*(18.4/265);
 TT313_HX402_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3016)*(18.4/265);
 TT319_HX402_STEAM_SYSTEM=modbusTCPClient4.holdingRegisterRead(3017)*(18.4/265);
 TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);
 TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);
 TT410_HTS_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3014)*(18.4/265);
 TT411_FPZ_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3015)*(18.4/265);
 TT430_SMR_TUBES_INLET=modbusTCPClient5.holdingRegisterRead(3016)*(18.4/265);
 TT511_SILICON_CARBIDE_OUT=modbusTCPClient5.holdingRegisterRead(3017)*(18.4/265);
 TT512_SILICON_CARBIDE_OUT=modbusTCPClient6.holdingRegisterRead(3012)*(18.4/265);
 TT513_HX504_IN=modbusTCPClient6.holdingRegisterRead(3013)*(18.4/265);
 TT514_HX504_OUT=modbusTCPClient6.holdingRegisterRead(3014)*(18.4/265);
 TT441_SMR_TUBE1_OUT=modbusTCPClient6.holdingRegisterRead(3015)*(18.4/265);
 TT442_SMR_TUBE2_OUT=modbusTCPClient6.holdingRegisterRead(3016)*(18.4/265);
 TT443_SMR_TUBE3_OUT=modbusTCPClient6.holdingRegisterRead(3017)*(18.4/265);
 TT444_SMR_TUBE4_OUT=modbusTCPClient7.holdingRegisterRead(3012)*(18.4/265);
 TT445_SMR_TUBE5_OUT=modbusTCPClient7.holdingRegisterRead(3013)*(18.4/265);
 TT446_SMR_TUBE6_OUT=modbusTCPClient7.holdingRegisterRead(3014)*(18.4/265);
 TT447_SMR_TUBE7_OUT=modbusTCPClient7.holdingRegisterRead(3015)*(18.4/265);
 TT448_SMR_TUBE8_OUT=modbusTCPClient7.holdingRegisterRead(3016)*(18.4/265);
 TT449_SMR_TUBE9_OUT=modbusTCPClient7.holdingRegisterRead(3017)*(18.4/265);
 Serial.print("TT142_SR_FUEL: ");Serial.println(TT142_SR_FUEL);
 Serial.print("TT301_HX406_STEAM_OUT : ");Serial.println(TT301_HX406_STEAM_OUT);
 Serial.print("TT303_HX504_STEAM_OUT : ");Serial.println(TT303_HX504_STEAM_OUT);
 Serial.print("TT306_EJECTOR_STEAM_IN : ");Serial.println(TT306_EJECTOR_STEAM_IN);
 Serial.print("TT313_HX402_STEAM_OUT : ");Serial.println(TT313_HX402_STEAM_OUT);
 Serial.print("TT319_HX402_STEAM_SYSTEM : ");Serial.println(TT319_HX402_STEAM_SYSTEM);
 Serial.print("TT407_STEAM_REFORMER_OUT_LREF : ");Serial.println(TT407_STEAM_REFORMER_OUT_LREF);
 Serial.print("TT408_HTS_IN_LREF : ");Serial.println(TT408_HTS_IN_LREF);
 Serial.print("TT410_HTS_OUT_LREF : ");Serial.println(TT410_HTS_OUT_LREF);
 Serial.print("TT411_FPZ_OUT_LREF : ");Serial.println(TT411_FPZ_OUT_LREF);
 Serial.print("TT430_SMR_TUBES_INLET : ");Serial.println(TT430_SMR_TUBES_INLET);
 Serial.print("TT511_SILICON_CARBIDE_OUT : ");Serial.println(TT511_SILICON_CARBIDE_OUT);
 Serial.print("TT512_SILICON_CARBIDE_OUT : ");Serial.println(TT512_SILICON_CARBIDE_OUT);
 Serial.print("TT513_HX504_IN : ");Serial.println(TT513_HX504_IN);
 Serial.print("TT514_HX504_OUT : ");Serial.println(TT514_HX504_OUT);
 Serial.print("TT441_SMR_TUBE1_OUT : ");Serial.println(TT441_SMR_TUBE1_OUT);
 Serial.print("TT442_SMR_TUBE2_OUT : ");Serial.println(TT442_SMR_TUBE2_OUT);
 Serial.print("TT442_SMR_TUBE2_OUT : ");Serial.println(TT442_SMR_TUBE2_OUT);
 Serial.print("TT443_SMR_TUBE3_OUT : ");Serial.println(TT443_SMR_TUBE3_OUT);
 Serial.print("TT444_SMR_TUBE4_OUT : ");Serial.println(TT444_SMR_TUBE4_OUT);
 Serial.print("TT445_SMR_TUBE5_OUT : ");Serial.println(TT445_SMR_TUBE5_OUT);
 Serial.print("TT446_SMR_TUBE6_OUT : ");Serial.println(TT446_SMR_TUBE6_OUT);
 Serial.print("TT447_SMR_TUBE7_OUT : ");Serial.println(TT447_SMR_TUBE7_OUT);
 Serial.print("TT448_SMR_TUBE8_OUT : ");Serial.println(TT448_SMR_TUBE8_OUT);
 Serial.print("TT449_SMR_TUBE9_OUT : ");Serial.println(TT449_SMR_TUBE9_OUT);*/

//read acromag 4

switch(TC_CHECK_COUNTER){
case 1:
 if(CURRENT_MILLIS - PREVIOUS_MILLIS_3 >= 3000){

 TT142_SR_FUEL=modbusTCPClient4.holdingRegisterRead(3012)*(18.4/265);
 TT301_HX406_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3013)*(.07);
 TT303_HX504_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3014)*(18.4/265);
 TT306_EJECTOR_STEAM_IN=modbusTCPClient4.holdingRegisterRead(3015)*(18.4/265);
 TT313_HX402_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3016)*(18.4/265);
 TT319_HX402_STEAM_SYSTEM=modbusTCPClient4.holdingRegisterRead(3017)*(18.4/265);

 if(TT301_HX406_STEAM_OUT>1000){Serial.println("TT301_HX406_STEAM_OUT > 1000C");FSM_STATE=0;ERROR=13;}
 if(TT303_HX504_STEAM_OUT>1000){Serial.println("TT303_HX504_STEAM_OUT > 1000C");FSM_STATE=0;ERROR=14;}
 //if(TT306_EJECTOR_STEAM_IN>1000){Serial.println("TT306_EJECTOR_STEAM_IN > 1000C");FSM_STATE=0;ERROR=15;}
 if(TT313_HX402_STEAM_OUT>1000){Serial.println("TT313_HX402_STEAM_OUT > 1000C");FSM_STATE=0;ERROR=16;}
 if(TT319_HX402_STEAM_SYSTEM>1000){Serial.println("TT319_HX402_STEAM_SYSTEM > 1000C");FSM_STATE=0;ERROR=17;}

 Serial.print("TT142_SR_FUEL: ");Serial.println(TT142_SR_FUEL);
 Serial.print("TT301_HX406_STEAM_OUT : ");Serial.println(TT301_HX406_STEAM_OUT);
 Serial.print("TT303_HX504_STEAM_OUT : ");Serial.println(TT303_HX504_STEAM_OUT);
 Serial.print("TT306_EJECTOR_STEAM_IN : ");Serial.println(TT306_EJECTOR_STEAM_IN);
 Serial.print("TT313_HX402_STEAM_OUT : ");Serial.println(TT313_HX402_STEAM_OUT);
 Serial.print("TT319_HX402_STEAM_SYSTEM : ");Serial.println(TT319_HX402_STEAM_SYSTEM);

 PREVIOUS_MILLIS_3=millis();
 TC_CHECK_COUNTER=2;
 break;
 }

 case 2:
//read acromag5
 if(CURRENT_MILLIS - PREVIOUS_MILLIS_3 >= 3000){

 TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);
 TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);
 TT410_HTS_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3014)*(18.4/265);
 TT411_FPZ_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3015)*(18.4/265);
 TT430_SMR_TUBES_INLET=modbusTCPClient5.holdingRegisterRead(3016)*(18.4/265);
 TT511_SILICON_CARBIDE_OUT=modbusTCPClient5.holdingRegisterRead(3017)*(18.4/265);

 if(TT407_STEAM_REFORMER_OUT_LREF>1000){Serial.println("TT407_STEAM_REFORMER_OUT_LREF > 1000C");FSM_STATE=0;ERROR=18;}
 if(TT408_HTS_IN_LREF>1000){Serial.println("TT408_HTS_IN_LREF > 1000C");FSM_STATE=0;ERROR=19;}
 //if(TT410_HTS_OUT_LREF>1000){Serial.println("TT410_HTS_OUT_LREF > 1000C");FSM_STATE=0;ERROR=20;}
 if(TT411_FPZ_OUT_LREF>1000){Serial.println("TT411_FPZ_OUT_LREF > 1000C");FSM_STATE=0;ERROR=21;} //current issue with reading
 //if(TT430_SMR_TUBES_INLET>1000){Serial.println("TT430_SMR_TUBES_INLET > 1000C");FSM_STATE=0;ERROR=22;} current issue with reading
 if(TT511_SILICON_CARBIDE_OUT>1000){Serial.println("TT511_SILICON_CARBIDE_OUT > 1000C");FSM_STATE=0;ERROR=23;}

 Serial.print("TT407_STEAM_REFORMER_OUT_LREF : ");Serial.println(TT407_STEAM_REFORMER_OUT_LREF);
 Serial.print("TT408_HTS_IN_LREF : ");Serial.println(TT408_HTS_IN_LREF);
 Serial.print("TT410_HTS_OUT_LREF : ");Serial.println(TT410_HTS_OUT_LREF);
 Serial.print("TT411_FPZ_OUT_LREF : ");Serial.println(TT411_FPZ_OUT_LREF);
 Serial.print("TT430_SMR_TUBES_INLET : ");Serial.println(TT430_SMR_TUBES_INLET);
 Serial.print("TT511_SILICON_CARBIDE_OUT : ");Serial.println(TT511_SILICON_CARBIDE_OUT);

 TC_CHECK_COUNTER=3;
 PREVIOUS_MILLIS_3=millis();
 break;
 }

 case 3:
 if(CURRENT_MILLIS - PREVIOUS_MILLIS_3>=3000){

 TT512_SILICON_CARBIDE_OUT=modbusTCPClient6.holdingRegisterRead(3012)*(18.4/265);
 TT513_HX504_IN=modbusTCPClient6.holdingRegisterRead(3013)*(18.4/265);
 TT514_HX504_OUT=modbusTCPClient6.holdingRegisterRead(3014)*(18.4/265);
 TT441_SMR_TUBE1_OUT=modbusTCPClient6.holdingRegisterRead(3015)*(18.4/265);
 TT442_SMR_TUBE2_OUT=modbusTCPClient6.holdingRegisterRead(3016)*(18.4/265);
 TT443_SMR_TUBE3_OUT=modbusTCPClient6.holdingRegisterRead(3017)*(18.4/265);

 if(TT512_SILICON_CARBIDE_OUT>1000){Serial.println("TT512_SILICON_CARBIDE_OUT > 1000C");FSM_STATE=0;ERROR=24;}
 if(TT513_HX504_IN>1000){Serial.println("TT513_HX504_IN > 1000C");FSM_STATE=0;ERROR=25;}
 if(TT514_HX504_OUT>1000){Serial.println("TT514_HX504_OUT > 1000C");FSM_STATE=0;ERROR=26;}
 if(TT441_SMR_TUBE1_OUT>1000){Serial.println("TT441_SMR_TUBE1_OUT > 1000C");FSM_STATE=0;ERROR=27;}
 if(TT442_SMR_TUBE2_OUT>1000){Serial.println("TT442_SMR_TUBE2_OUT > 1000C");FSM_STATE=0;ERROR=28;}
 if(TT443_SMR_TUBE3_OUT>1000){Serial.println("TT443_SMR_TUBE3_OUT > 1000C");FSM_STATE=0;ERROR=29;}

 Serial.print("TT512_SILICON_CARBIDE_OUT : ");Serial.println(TT512_SILICON_CARBIDE_OUT);
 Serial.print("TT513_HX504_IN : ");Serial.println(TT513_HX504_IN);
 Serial.print("TT514_HX504_OUT : ");Serial.println(TT514_HX504_OUT);
 Serial.print("TT441_SMR_TUBE1_OUT : ");Serial.println(TT441_SMR_TUBE1_OUT);
 Serial.print("TT442_SMR_TUBE2_OUT : ");Serial.println(TT442_SMR_TUBE2_OUT);
 Serial.print("TT442_SMR_TUBE2_OUT : ");Serial.println(TT442_SMR_TUBE2_OUT);
 Serial.print("TT443_SMR_TUBE3_OUT : ");Serial.println(TT443_SMR_TUBE3_OUT);

 TC_CHECK_COUNTER=4;
 PREVIOUS_MILLIS_3=millis();
 break;
 }

 case 4:
 if(CURRENT_MILLIS - PREVIOUS_MILLIS_3 >= 3000){

 TT444_SMR_TUBE4_OUT=modbusTCPClient7.holdingRegisterRead(3012)*(18.4/265);
 TT445_SMR_TUBE5_OUT=modbusTCPClient7.holdingRegisterRead(3013)*(18.4/265);
 TT446_SMR_TUBE6_OUT=modbusTCPClient7.holdingRegisterRead(3014)*(18.4/265);
 TT447_SMR_TUBE7_OUT=modbusTCPClient7.holdingRegisterRead(3015)*(18.4/265);
 TT448_SMR_TUBE8_OUT=modbusTCPClient7.holdingRegisterRead(3016)*(18.4/265);
 TT449_SMR_TUBE9_OUT=modbusTCPClient7.holdingRegisterRead(3017)*(18.4/265);

 if(TT444_SMR_TUBE4_OUT>700){Serial.println("TT444_SMR_TUBE4_OUT > 1000C");FSM_STATE=0;ERROR=30;}
 if(TT445_SMR_TUBE5_OUT>700){Serial.println("TT445_SMR_TUBE5_OUT > 1000C");FSM_STATE=0;ERROR=31;}
 if(TT446_SMR_TUBE6_OUT>700){Serial.println("TT446_SMR_TUBE6_OUT > 1000C");FSM_STATE=0;ERROR=32;}
 if(TT447_SMR_TUBE7_OUT>700){Serial.println("TT447_SMR_TUBE7_OUT > 1000C");FSM_STATE=0;ERROR=33;}
 if(TT448_SMR_TUBE8_OUT>700){Serial.println("TT448_SMR_TUBE8_OUT > 1000C");FSM_STATE=0;ERROR=34;}
 if(TT449_SMR_TUBE9_OUT>700){Serial.println("TT449_SMR_TUBE9_OUT > 1000C");FSM_STATE=0;ERROR=35;}

 Serial.print("TT444_SMR_TUBE4_OUT : ");Serial.println(TT444_SMR_TUBE4_OUT);
 Serial.print("TT445_SMR_TUBE5_OUT : ");Serial.println(TT445_SMR_TUBE5_OUT);
 Serial.print("TT446_SMR_TUBE6_OUT : ");Serial.println(TT446_SMR_TUBE6_OUT);
 Serial.print("TT447_SMR_TUBE7_OUT : ");Serial.println(TT447_SMR_TUBE7_OUT);
 Serial.print("TT448_SMR_TUBE8_OUT : ");Serial.println(TT448_SMR_TUBE8_OUT);
 Serial.print("TT449_SMR_TUBE9_OUT : ");Serial.println(TT449_SMR_TUBE9_OUT);

 PREVIOUS_MILLIS_3=millis();
 TC_CHECK_COUNTER=1;
 break;

  }
 }

 TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);//for superheat condition check
 TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);//for superheat condition check

}

void integrityCheck(){
  Serial.println("Checking Signal Integrity.");
 if(!modbusTCPClient1.connected()){modbusTCPClient1.begin(serverA1,502);}
 if(!modbusTCPClient2.connected()){modbusTCPClient2.begin(serverA2,502);}
 if(!modbusTCPClient3.connected()){modbusTCPClient3.begin(serverA3,502);}
 if(!modbusTCPClient4.connected()){modbusTCPClient4.begin(serverA4,502);}
 if(!modbusTCPClient5.connected()){modbusTCPClient5.begin(serverA5,502);}
 if(!modbusTCPClient6.connected()){modbusTCPClient6.begin(serverA6,502);}
 if(!modbusTCPClient7.connected()){modbusTCPClient7.begin(serverA7,502);}

 PT318_HX406_OUTPUT_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3020)*(.0125))-50;//ref:43017 read Channel 4 PressureTransducer_318.. 1psi/80counts maximux
 PT213_RO_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3021)*(.0125))-50;//ref:43028 read Channel 5 PT213
 PT420_STEAM_EJECTOR_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3022)*(.0125))-47;//ref:43016 read Channel 6 PT420
 PT304_TWV308_INPUT_PRESSURE = (modbusTCPClient2.holdingRegisterRead(3023)*(.0125))-50;//ref:43017 read Channel 7 PT304
// if(PT318_HX406_OUTPUT_PRESSURE>=240){FSM_STATE=0;ERROR=3;}
// else{ERROR=0;}
// if(PT213_RO_PRESSURE>=240){FSM_STATE=0;ERROR=4;}
// else{ERROR=0;}
 if(PT420_STEAM_EJECTOR_PRESSURE>=240){FSM_STATE=0;ERROR=5;}
 else{ERROR=0;}
 if(PT304_TWV308_INPUT_PRESSURE>=240){FSM_STATE=0;ERROR=6;}
 else{ERROR=0;}

 TT142_SR_FUEL=modbusTCPClient4.holdingRegisterRead(3012)*(18.4/265);
 TT301_HX406_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3013)*(18.4/265);
 TT303_HX504_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3014)*(18.4/265);
 TT306_EJECTOR_STEAM_IN=modbusTCPClient4.holdingRegisterRead(3015)*(18.4/265);
 TT313_HX402_STEAM_OUT=modbusTCPClient4.holdingRegisterRead(3016)*(18.4/265);
 TT319_HX402_STEAM_SYSTEM=modbusTCPClient4.holdingRegisterRead(3017)*(18.4/265);
 TT407_STEAM_REFORMER_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3012)*(18.4/265);
 TT408_HTS_IN_LREF=modbusTCPClient5.holdingRegisterRead(3013)*(18.4/265);
 TT410_HTS_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3014)*(18.4/265);
 TT411_FPZ_OUT_LREF=modbusTCPClient5.holdingRegisterRead(3015)*(18.4/265);
 TT430_SMR_TUBES_INLET=modbusTCPClient5.holdingRegisterRead(3016)*(18.4/265);
 TT511_SILICON_CARBIDE_OUT=modbusTCPClient5.holdingRegisterRead(3017)*(18.4/265);
 TT512_SILICON_CARBIDE_OUT=modbusTCPClient6.holdingRegisterRead(3012)*(18.4/265);
 TT513_HX504_IN=modbusTCPClient6.holdingRegisterRead(3013)*(18.4/265);
 TT514_HX504_OUT=modbusTCPClient6.holdingRegisterRead(3014)*(18.4/265);
 TT441_SMR_TUBE1_OUT=modbusTCPClient6.holdingRegisterRead(3015)*(18.4/265);
 TT442_SMR_TUBE2_OUT=modbusTCPClient6.holdingRegisterRead(3016)*(18.4/265);
 TT443_SMR_TUBE3_OUT=modbusTCPClient6.holdingRegisterRead(3017)*(18.4/265);
 TT444_SMR_TUBE4_OUT=modbusTCPClient7.holdingRegisterRead(3012)*(18.4/265);
 TT445_SMR_TUBE5_OUT=modbusTCPClient7.holdingRegisterRead(3013)*(18.4/265);
 TT446_SMR_TUBE6_OUT=modbusTCPClient7.holdingRegisterRead(3014)*(18.4/265);
 TT447_SMR_TUBE7_OUT=modbusTCPClient7.holdingRegisterRead(3015)*(18.4/265);
 TT448_SMR_TUBE8_OUT=modbusTCPClient7.holdingRegisterRead(3016)*(18.4/265);
 TT449_SMR_TUBE9_OUT=modbusTCPClient7.holdingRegisterRead(3017)*(18.4/265);

  //analog outputs
 modbusTCPClient1.holdingRegisterWrite(0x12,OFF);//write channel 0 (BLWRSpeed) to 10 volts
 modbusTCPClient1.holdingRegisterWrite(0x13,OFF);//write channel 1 (WP_Speed) to 10 volts
 modbusTCPClient1.holdingRegisterWrite(0x14,OFF);//write channel 2 (FCV134) to 10 volts
 modbusTCPClient1.holdingRegisterWrite(0x15,OFF);//write channel 3 (FCV205) to 10 volts
 modbusTCPClient1.holdingRegisterWrite(0x16,OFF);//write channel 4 (FCV141) to 10 volts

 //digital outputs
 modbusTCPClient3.coilWrite(7,OFF);//XV801
 modbusTCPClient3.coilWrite(13,255);//BLWR_EN ON bc opposite
 modbusTCPClient3.coilWrite(14,255);//WP_EN ON bc opposite
 modbusTCPClient3.coilWrite(9,OFF);//TWV308
 modbusTCPClient3.coilWrite(6,OFF);//XV1100
 modbusTCPClient3.coilWrite(5,OFF);//XV501
 modbusTCPClient3.coilWrite(12,OFF);//BMM_CR2
 modbusTCPClient3.coilWrite(8,OFF);//TWV901
 modbusTCPClient3.coilWrite(4,OFF);//xv909

 FCV134_BURNER_FUEL_FLOW_FB = (modbusTCPClient2.holdingRegisterRead(3026)*(.005))-20;//ref:43028 read Channel 10 FCV134
 if(!(FCV134_BURNER_FUEL_FLOW_FB<0.1)){ERROR=2;FSM_STATE=0;SENSOR_INTEGRITY_CHECK=false;}
 else{SENSOR_INTEGRITY_CHECK=true;}

}

void readOCI(){
  Serial.println("Reading OCI417.");
  OCI_RESULT=NODE.readInputRegisters(OCI_INPUT_STATUS_REGISTER,2);//address,qty
  //do something with data if read is successful
  if (OCI_RESULT==NODE.ku8MBSuccess)
  {
    OCI_INPUT_STATUS_WORD = NODE.getResponseBuffer(0);
    Serial.print("OCI INPUT WORD: ");Serial.println(OCI_INPUT_STATUS_WORD,BIN);
    DUN_ZSL = bitRead(OCI_INPUT_STATUS_WORD,1);//PROOF OF CLOSURE
    DUN_PSH = bitRead(OCI_INPUT_STATUS_WORD,4);//PRESS SW VALVE PROVING
    DUN_PSL = bitRead(OCI_INPUT_STATUS_WORD,5);//LOW GAS PRESSURE SWITCH
    COMBUSTION_PRESSURE_SWITCH = bitRead(OCI_INPUT_STATUS_WORD,7);//COMBUSTION AIR SW

    OCI_OUTPUT_STATUS_WORD=NODE.getResponseBuffer(1);
    Serial.print("OCI OUTPUT WORD: ");Serial.println(OCI_OUTPUT_STATUS_WORD,BIN);
    BMM_PROOF_OF_FLAME=bitRead(OCI_OUTPUT_STATUS_WORD,0);
    if(FSM_STATE>6 && BMM_PROOF_OF_FLAME==false){FSM_STATE=0;ERROR=10;}
    BMM_ALARM_STATUS=bitRead(OCI_OUTPUT_STATUS_WORD,1);
    OCI_TO_BMM_COM=bitRead(OCI_OUTPUT_STATUS_WORD,2);
  }
}

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void readBtn(){
  Serial.println("Reading Buttons.");
  //read if there has been a change for the inputs
  //function for reading buttons and signaling indicators

  if(!modbusTCPClient3.connected()){modbusTCPClient3.begin(serverA2,502);}

  if(modbusTCPClient3.inputRegisterRead(3002)){

    if(bitRead(modbusTCPClient3.holdingRegisterRead(26),15)){
      ESTOP_FLAG=true;ERROR=1;
      modbusTCPClient3.coilWrite(1,0);
      modbusTCPClient3.coilWrite(3,0);
    }
  if(ESTOP_FLAG==false){

    if(bitRead(modbusTCPClient3.holdingRegisterRead(26),2)){
      AMB_BTN_FLAG=true;GRN_BTN_FLAG=false;
      modbusTCPClient3.coilWrite(1,0);
      modbusTCPClient3.coilWrite(3,1);
    }

    if(bitRead(modbusTCPClient3.holdingRegisterRead(26),0)){
      GRN_BTN_FLAG=true;AMB_BTN_FLAG=false;
      modbusTCPClient3.coilWrite(1,1);
      modbusTCPClient3.coilWrite(3,0);
   }
  }
 }
}

/*
error map
1-estop
2-fcv134 timeout integrity check
3-pt318 over 250psi
4-pt213 over 250psi
5-pt420 over 250psi
6-pt304 over 250psi
7-super heat error
8-No Flame detected
9-Steam gen timeout
10-Loss of Flame
11-Burner reach 800 c timeout
12-Temperature > 1000C
13-temp error
14-
15-
16-
17-
18-
19-
20-
21-
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-
32-
33-
34-
35-
36-
*/

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.