void TVolumenob::SetValue(int32 value){ float Pie=3.14; theta= Gettheta(value); if (theta>218)theta=218; else if (theta<-38)theta=-38; nbpoint.Set(nbcenter.x+r*cos(theta/180*Pie),nbcenter.y-r*sin(theta/180*Pie)); Update(); BControl::SetValue(value); PostValue(); }
/* *Function: QueryResponse *Inputs:none *Outputs:none *Returns:none */ void Iec104driver_Instance::QueryResponse(QObject *p, const QString &c, int id, QObject*caller) // handles database responses { IT_IT("Iec104driver_Instance::QueryResponse"); if(p != this) return; switch(id) { case tListUnits: { // // get the properties - need to be receipe aware // unit_name = GetConfigureDb()->GetString("NAME"); QString pc = "select * from PROPS where SKEY='" + Name + "' and (IKEY = '(default)' or IKEY='"+ GetReceipeName() + "') order by IKEY desc;"; // // get the properties SKEY = unit name IKEY = receipe name // GetConfigureDb()->DoExec(this,pc,tUnitProperties); if(GetReceipeName() == "(default)") { // get the properties for this receipe - fall back to default QString cmd = "select * from SAMPLE where UNIT='" + GetConfigureDb()->GetString("NAME") + "' and ENABLED=1;"; GetConfigureDb()->DoExec(this,cmd,tList); } else { QString cmd = "select * from SAMPLE where UNIT='" + GetConfigureDb()->GetString("NAME") + "' and NAME in (" + DriverInstance::FormSamplePointList() + ");"; // only the enabled sample points GetConfigureDb()->DoExec(this,cmd,tList); }; } break; case tList: // list of sample points controlled by the unit { // // copy the list to local dictionary // now get the properties for each of the sample points QString nl; // name list for getting properties // for(int ii = 1; ii <= IecItems; ii++) // initialise { Values[ii].Name = ""; Values[ii].clear(); }; // // int n = GetConfigureDb()->GetNumberResults(); for(int i = 0; i < n; i++,GetConfigureDb()->FetchNext()) { int idx = GetConfigureDb()->GetInt("IPINDEX"); if (idx > 0 && idx <= IecItems) { Values[idx].Name = GetConfigureDb()->GetString("NAME"); // save the name }; if(i) { nl += ","; }; nl += "'" + GetConfigureDb()->GetString("NAME") + "'"; }; QString cmd = "select * from PROPS where SKEY='SAMPLEPROPS' and IKEY in ("+nl+");"; GetConfigureDb()->DoExec(this,cmd,tSamplePointProperties); }; break; case tSamplePointProperties://properties specific to a sample point { int n = GetConfigureDb()->GetNumberResults(); for(int j = 0; j < n; j++,GetConfigureDb()->FetchNext()) // may get a boat load of properties back { // look for the entry in the table for(int k = 1; k <= IecItems;k++) { if(Values[k].Name == GetConfigureDb()->GetString("IKEY")) { // QString s = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); // QTextIStream is(&s); // extract the values // QString a; // is >> a; // interval // Values[k].SamplePeriod = QStringToInterval(a); // Values[k].clear(); // set up // is >> a; // now get the // Values[k].Low = a.toDouble(); // 4 - 20 low value // is >> a; // Values[k].High = a.toDouble(); // 4 - 20 high value // is >> a; // Values[k].fSpotValue = a.toInt(); break; }; }; }; }; break; case tUnitProperties: { if(GetConfigureDb()->GetNumberResults() > 0) { // QString s = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); // the top one is either the receipe or (default) QTextIStream is(&s); // extract the values // is >> IecItems; // how many IEC items there are in the RTU is >> Cfg.IEC104ServerIPAddress; // IEC 104 server IP Address is >> Cfg.IEC104ServerIPPort; // IEC 104 server TCP port is >> Cfg.IEC104ServerCASDU; // IEC 104 server CASDU Countdown = 1; if(Values) { delete[] Values; Values = NULL; } Values = new Track[IecItems+1]; // //if(InTest()) //{ // Cfg.SampleTime = 1000; // override sampling period //}; // //Start IEC 104 master driver if(!Connect()) { QSLogAlarm(Name,tr("Failed to start IEC 104 client driver")); } } } break; case tGetSamplePointNamefromIOA: { QSTransaction &t = GetConfigureDb()->CurrentTransaction(); if(GetConfigureDb()->GetNumberResults() > 0) { // #ifdef DEPRECATED_IEC104_CONFIG QString SamplePointName = UndoEscapeSQLText(GetConfigureDb()->GetString("IKEY")); #else QString SamplePointName = UndoEscapeSQLText(GetConfigureDb()->GetString("NAME")); #endif double v = 0.0; if(strlen((const char*)t.Data1) > 0) { v = atof((const char*)t.Data1); PostValue(SamplePointName, "VALUE", v); //Post the value directly in memory database } printf("SamplePointName = %s, IOA = %s, value = %lf\n", (const char*)SamplePointName, (const char*)t.Data2, v); } } break; case tGetIOAfromSamplePointName: { QSTransaction &t = GetConfigureDb()->CurrentTransaction(); if(GetConfigureDb()->GetNumberResults() > 0) { // #ifdef DEPRECATED_IEC104_CONFIG QString IOACommand = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); #else int IOACommand = GetConfigureDb()->GetInt("IOA"); #endif int command_value = 0; if(strlen((const char*)t.Data1) > 0) { command_value = atoi((const char*)t.Data1); } printf("Command from %s, IOA = %d, value = %d\n", (const char*)t.Data2, IOACommand, command_value); //Send C_SC_NA_1////////////////////////////////////////////////////////////////////////// struct iec_item item_to_send; memset(&item_to_send,0x00, sizeof(struct iec_item)); item_to_send.iec_type = C_SC_NA_1; item_to_send.iec_obj.ioa = IOACommand; item_to_send.iec_obj.o.type45.scs = command_value; item_to_send.msg_id = msg_sent_in_control_direction++; item_to_send.checksum = clearCrc((unsigned char *)&item_to_send, sizeof(struct iec_item)); fifo_put(fifo_control_direction, (char *)&item_to_send, sizeof(struct iec_item)); /////////////////////////////////////////////////////////////////////////////////////////// } } break; default: break; }
/* *Function: QueryResponse *Inputs:none *Outputs:none *Returns:none */ void Modbus_driver_Instance::QueryResponse(QObject *p, const QString &c, int id, QObject*caller) // handles database responses { IT_IT("Modbus_driver_Instance::QueryResponse"); if(p != this) return; switch(id) { case tListUnits: { // // get the properties - need to be receipe aware // unit_name = GetConfigureDb()->GetString("NAME"); QString pc = "select * from PROPS where SKEY='" + Name + "' and (IKEY = '(default)' or IKEY='"+ GetReceipeName() + "') order by IKEY desc;"; // // get the properties SKEY = unit name IKEY = receipe name // GetConfigureDb()->DoExec(this,pc,tUnitProperties); if(GetReceipeName() == "(default)") { // get the properties for this receipe - fall back to default QString cmd = "select * from SAMPLE where UNIT='" + GetConfigureDb()->GetString("NAME") + "' and ENABLED=1;"; GetConfigureDb()->DoExec(this,cmd,tList); } else { QString cmd = "select * from SAMPLE where UNIT='" + GetConfigureDb()->GetString("NAME") + "' and NAME in (" + DriverInstance::FormSamplePointList() + ");"; // only the enabled sample points GetConfigureDb()->DoExec(this,cmd,tList); }; } break; case tList: // list of sample points controlled by the unit { // // copy the list to local dictionary // now get the properties for each of the sample points QString nl; // name list for getting properties // for(int ii = 1; ii <= IecItems; ii++) // initialise { Values[ii].Name = ""; Values[ii].clear(); }; // // int n = GetConfigureDb()->GetNumberResults(); for(int i = 0; i < n; i++,GetConfigureDb()->FetchNext()) { int idx = GetConfigureDb()->GetInt("IPINDEX"); if (idx > 0 && idx <= IecItems) { Values[idx].Name = GetConfigureDb()->GetString("NAME"); // save the name }; if(i) { nl += ","; }; nl += "'" + GetConfigureDb()->GetString("NAME") + "'"; }; QString cmd = "select * from PROPS where SKEY='SAMPLEPROPS' and IKEY in ("+nl+");"; GetConfigureDb()->DoExec(this,cmd,tSamplePointProperties); }; break; case tSamplePointProperties://properties specific to a sample point { int n = GetConfigureDb()->GetNumberResults(); for(int j = 0; j < n; j++,GetConfigureDb()->FetchNext()) // may get a boat load of properties back { // look for the entry in the table for(int k = 1; k <= IecItems;k++) { if(Values[k].Name == GetConfigureDb()->GetString("IKEY")) { // QString s = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); // QTextIStream is(&s); // extract the values // QString a; // is >> a; // interval // Values[k].SamplePeriod = QStringToInterval(a); // Values[k].clear(); // set up // is >> a; // now get the // Values[k].Low = a.toDouble(); // 4 - 20 low value // is >> a; // Values[k].High = a.toDouble(); // 4 - 20 high value // is >> a; // Values[k].fSpotValue = a.toInt(); break; }; }; }; }; break; case tUnitProperties: { if(GetConfigureDb()->GetNumberResults() > 0) { // QString s = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); // the top one is either the receipe or (default) QTextIStream is(&s); // extract the values // is >> IecItems; // how many modbus items there are in the RTU or PLC is >> Cfg.SampleTime; // how long we sample for in milliseconds is >> Cfg.ServerID; //MODBUS TCP is >> Cfg.MODBUSServerIPAddress; // MODBUS server IP address (slave) is >> Cfg.MODBUSServerTCPPort; // MODBUS server TCP port //MODBUS RTU //If this fields are filled in, then we have a serial line is >> Cfg.SerialDevice; is >> Cfg.Baud; is >> Cfg.DataBits; is >> Cfg.StopBit; is >> Cfg.Parity; if(strlen((const char*)Cfg.SerialDevice) == 0) { Cfg.context = InstanceCfg::TCP; } else { Cfg.context = InstanceCfg::RTU; } Countdown = 1; if(Values) { delete[] Values; Values = NULL; } Values = new Track[IecItems+1]; // if(InTest()) { Cfg.SampleTime = 1000; // override sampling period }; // //Start MODBUS client driver if(!Connect()) { QSLogAlarm(Name,tr("Failed to start MODBUS client driver")); } } } break; case tGetSamplePointNamefromIOA: { QSTransaction &t = GetConfigureDb()->CurrentTransaction(); if(GetConfigureDb()->GetNumberResults() > 0) { // #ifdef DEPRECATED_MODBUS_CONFIG QString SamplePointName = UndoEscapeSQLText(GetConfigureDb()->GetString("IKEY")); #else QString SamplePointName = UndoEscapeSQLText(GetConfigureDb()->GetString("NAME")); #endif double v = 0.0; if(strlen((const char*)t.Data1) > 0) { v = atof((const char*)t.Data1); PostValue(SamplePointName, "VALUE", v); //Post the value directly in memory database } printf("SamplePointName = %s, IOA = %s, value = %lf\n", (const char*)SamplePointName, (const char*)t.Data2, v); } } break; case tGetIOAfromSamplePointName: { QSTransaction &t = GetConfigureDb()->CurrentTransaction(); if(GetConfigureDb()->GetNumberResults() > 0) { // #ifdef DEPRECATED_MODBUS_MASTER_CONFIG QString IOACommand = UndoEscapeSQLText(GetConfigureDb()->GetString("DVAL")); #else int IOACommand = GetConfigureDb()->GetInt("IOA"); #endif double command_value = 0.0; if(strlen((const char*)t.Data1) > 0) { command_value = atof((const char*)t.Data1); } printf("Command from %s, IOA = %d, value = %lf\n", (const char*)t.Data2, IOACommand, command_value); //Send C_SE_TC_1////////////////////////////////////////////////////////////////////////// struct iec_item item_to_send; memset(&item_to_send,0x00, sizeof(struct iec_item)); item_to_send.iec_type = C_SE_TC_1; item_to_send.iec_obj.ioa = IOACommand; item_to_send.iec_obj.o.type63.sv = (float)command_value; struct cp56time2a actual_time; get_utc_host_time(&actual_time); item_to_send.iec_obj.o.type63.time = actual_time; item_to_send.msg_id = msg_sent_in_control_direction++; item_to_send.checksum = clearCrc((unsigned char *)&item_to_send, sizeof(struct iec_item)); /////////////////////////////////////////////////////////////////////////////////////////// ////////////////////Middleware///////////////////////////////////////////// //prepare published data memset(&instanceSend,0x00, sizeof(iec_item_type)); instanceSend.iec_type = item_to_send.iec_type; memcpy(&(instanceSend.iec_obj), &(item_to_send.iec_obj), sizeof(struct iec_object)); instanceSend.msg_id = item_to_send.msg_id; instanceSend.checksum = item_to_send.checksum; ORTEPublicationSend(publisher); //////////////////////////Middleware///////////////////////////////////////// } } break; default: break; }