#include #include #include #include #include struct scada_point{ char name[35]; char tag[20]; double current_value; double next_value; unsigned char write_to_driver; //set to 1 to write to driver, set to 0 to write to real time DB unsigned int checksum; }; /* Internal scada variables and functions exit_loop : initialized at 0,on stop of driver its value is 1 scada_db : scada vector of struct scada_point items int numSamplePoints; : number of sample point inside scada database int processed_id; : itemID of the processed value void scan_rate(void) : scan rate void lock(void) : lock access of other threads to scada_db void unlock(void) : let other threads to access scada_db void post_value() : post the processed value to real time DB or to driver */ double GetTagValue(char* name_tag); void SetTagValue(char* name_tag, double calculated); int main(int argc, char **argv) { int itemID; //index of item in database int r; //Set here number of inputs #define NUM_OF_INPUTS 5 double input_value[NUM_OF_INPUTS]; double output_value; for(itemID = 0; ;) { if(exit_loop) { break; } lock(); processed_id = itemID; //////////Add your code from here///////////////////// if(r = strcmp(scada_db[processed_id].name, "CALCpoint01") == 0) { input_value[0] = GetTagValue("MDBPoint01"); input_value[1] = GetTagValue("MDBPoint02"); input_value[2] = GetTagValue("MDBPoint03"); input_value[3] = GetTagValue("MDBPoint04"); input_value[4] = GetTagValue("MDBPoint05"); output_value = input_value[0]/10.0 + input_value[1]/10.0 + input_value[2]/10.0 + input_value[3]/10.0 + input_value[4]/10.0; SetTagValue("CALCpoint01", output_value); } if(r = strcmp(scada_db[processed_id].name, "CALCpoint02") == 0) { input_value[0] = GetTagValue("MDBPoint06"); input_value[1] = GetTagValue("MDBPoint07"); input_value[2] = GetTagValue("MDBPoint08"); input_value[3] = GetTagValue("MDBPoint09"); input_value[4] = GetTagValue("MDBPoint10"); output_value = input_value[0]/10.0 + input_value[1]/10.0 + input_value[2]/10.0 + input_value[3]/10.0 + input_value[4]/10.0; SetTagValue("CALCpoint02", output_value); } if(r = strcmp(scada_db[processed_id].name, "CALCpoint03") == 0) { input_value[0] = GetTagValue("MDBPoint11"); input_value[1] = GetTagValue("MDBPoint12"); input_value[2] = GetTagValue("MDBPoint13"); input_value[3] = GetTagValue("MDBPoint14"); input_value[4] = GetTagValue("MDBPoint15"); output_value = input_value[0]/10.0 + input_value[1]/10.0 + input_value[2]/10.0 + input_value[3]/10.0 + input_value[4]/10.0; SetTagValue("CALCpoint03", output_value); } if(r = strcmp(scada_db[processed_id].name, "CALCpoint04") == 0) { input_value[0] = GetTagValue("MDBPoint16"); input_value[1] = GetTagValue("MDBPoint17"); input_value[2] = GetTagValue("MDBPoint18"); input_value[3] = GetTagValue("MDBPoint19"); input_value[4] = GetTagValue("MDBPoint20"); output_value = input_value[0]/10.0 + input_value[1]/10.0 + input_value[2]/10.0 + input_value[3]/10.0 + input_value[4]/10.0; SetTagValue("CALCpoint04", output_value); } if(r = strcmp(scada_db[processed_id].name, "CALCpoint05") == 0) { input_value[0] = GetTagValue("MDBPoint21"); input_value[1] = GetTagValue("MDBPoint22"); input_value[2] = GetTagValue("MDBPoint23"); input_value[3] = GetTagValue("MDBPoint24"); input_value[4] = GetTagValue("MDBPoint25"); output_value = input_value[0]/10.0 + input_value[1]/10.0 + input_value[2]/10.0 + input_value[3]/10.0 + input_value[4]/10.0; SetTagValue("CALCpoint05", output_value); } ///////////////////to here////////////////////////////////////////////// unlock(); fflush(stdout); if(itemID == 0) { scan_rate(); } itemID++; if(itemID == numSamplePoints) { itemID = 0; } } return 0; } double GetTagValue(char* name_tag) { int r; int item_id_input; double input_value; for(item_id_input = 0; item_id_input < numSamplePoints; item_id_input++) { if(r = strcmp(scada_db[item_id_input].name, name_tag) == 0) { //printf("scada_db[%d].current_value = %lf\n", item_id_input, scada_db[item_id_input].current_value); //printf("\n"); input_value = scada_db[item_id_input].current_value; return input_value; } } return 0.0; } void SetTagValue(char* name_tag, double calculated) { int r; double delta = 0.1; if(r = strcmp(scada_db[processed_id].name, name_tag) == 0) { if((abs(scada_db[processed_id].current_value - calculated) > delta)) { scada_db[processed_id].write_to_driver = 0; scada_db[processed_id].current_value = calculated; post_value(); } } }