| 1,10 → 1,12 |
| #include "K6517-ctrl.h" |
| #include <tcpsupp.h> |
| #include <rs232.h> |
| #include <utility.h> |
| #include <userint.h> |
| #include <ansi_c.h> |
| #include <pw18-1.8aq.h> |
| #include "TempCtrl.h" |
| FILE *gFp; |
| #include <pw18-1.8aq.h> |
| #include "TempCtrl.h" |
| FILE *gFp; |
| |
| #define RSTREG(a,x) (a&=(~(x))) |
| #define SETREG(a,x) (a|=x) |
| 24,32 → 26,30 |
| #define COM_PORT 11 |
| |
| |
| typedef struct |
| { |
| double dState; // Last temperature input |
| double iState; // Integrator state |
| double iMax, iMin; // Maximum and minimum allowable integrator state |
| double iGain, // integral gain |
| pGain, // proportional gain |
| dGain; // derivative gain |
| typedef struct { |
| double dState; // Last temperature input |
| double iState; // Integrator state |
| double iMax, iMin; // Maximum and minimum allowable integrator state |
| double iGain, // integral gain |
| pGain, // proportional gain |
| dGain; // derivative gain |
| } SPid; |
| |
| SPid pid; |
| |
| double UpdatePID(SPid * pid, double error, double temperature) |
| { |
| double pTerm, dTerm, iTerm; |
| pTerm = pid->pGain * error; |
| // calculate the proportional term |
| // calculate the integral state with appropriate limiting |
| pid->iState += error; |
| if (pid->iState > pid->iMax) pid->iState = pid->iMax; |
| else if (pid->iState < pid->iMin) pid->iState = pid->iMin; |
| //if (debug ) |
| iTerm = pid->iGain * pid->iState; // calculate the integral term |
| dTerm = pid->dGain * (temperature - pid->dState); |
| pid->dState = temperature; |
| return pTerm + iTerm - dTerm; |
| double UpdatePID(SPid *pid, double error, double temperature) { |
| double pTerm, dTerm, iTerm; |
| pTerm = pid->pGain * error; |
| // calculate the proportional term |
| // calculate the integral state with appropriate limiting |
| pid->iState += error; |
| if (pid->iState > pid->iMax) pid->iState = pid->iMax; |
| else if (pid->iState < pid->iMin) pid->iState = pid->iMin; |
| //if (debug ) |
| iTerm = pid->iGain * pid->iState; // calculate the integral term |
| dTerm = pid->dGain * (temperature - pid->dState); |
| pid->dState = temperature; |
| return pTerm + iTerm - dTerm; |
| } |
| |
| void SetDimming(int state) { |
| 61,74 → 61,149 |
| |
| |
| int CVICALLBACK ReadVoltageCurrentCB (int panel, int control, int event, |
| void *callbackData, int eventData1, int eventData2) |
| { |
| |
| int iRet; |
| char ch=0; |
| double Voltage; |
| double Current; |
| char cv_cc; |
| switch (event) |
| { |
| case EVENT_COMMIT: |
| GetCtrlVal(pa,PA_CHANNEL, &ch); |
| iRet = TMI_TimeOut(TMI_DeviceId, 1); |
| iRet = TMI_Refresh(TMI_DeviceId); |
| |
| |
| iRet = TMI_MoniDataQ(TMI_DeviceId, ch+1, &Voltage, &Current, &cv_cc); |
| |
| SetCtrlVal(panel, PA_VMON, Voltage); |
| SetCtrlVal(panel, PA_IMON, Current); |
| SetCtrlVal(panel, PA_CVCC, cv_cc); |
| |
| break; |
| } |
| return 0; |
| void *callbackData, int eventData1, int eventData2) { |
| |
| int iRet; |
| char ch=0; |
| double Voltage; |
| double Current; |
| char cv_cc; |
| switch (event) { |
| case EVENT_COMMIT: |
| GetCtrlVal(pa,PA_CHANNEL, &ch); |
| iRet = TMI_TimeOut(TMI_DeviceId, 1); |
| iRet = TMI_Refresh(TMI_DeviceId); |
| |
| |
| iRet = TMI_MoniDataQ(TMI_DeviceId, ch+1, &Voltage, &Current, &cv_cc); |
| |
| SetCtrlVal(panel, PA_VMON, Voltage); |
| SetCtrlVal(panel, PA_IMON, Current); |
| SetCtrlVal(panel, PA_CVCC, cv_cc); |
| |
| break; |
| } |
| return 0; |
| } |
| |
| |
| int CVICALLBACK SelectChannelCB (int panel, int control, int event, |
| void *callbackData, int eventData1, int eventData2) |
| { |
| unsigned char state, preset; |
| void *callbackData, int eventData1, int eventData2) { |
| unsigned char state, preset; |
| double Voltage, Current; |
| unsigned char ch; |
| switch (event) |
| { |
| case EVENT_COMMIT: |
| GetCtrlVal(pa,PA_CHANNEL, &ch); |
| unsigned char ch; |
| switch (event) { |
| case EVENT_COMMIT: |
| GetCtrlVal(pa,PA_CHANNEL, &ch); |
| GetCtrlVal(pa,PA_PRESET, &preset); |
| |
| |
| |
| TMI_VoltageQ(TMI_DeviceId, ch+1, preset, &Voltage); |
| TMI_CurrentQ(TMI_DeviceId, ch+1, preset, &Current); |
| SetCtrlVal(pa, PA_VSET, Voltage); |
| SetCtrlVal(pa, PA_ISET, Current); |
| |
| break; |
| } |
| return 0; |
| |
| |
| |
| TMI_VoltageQ(TMI_DeviceId, ch+1, preset, &Voltage); |
| TMI_CurrentQ(TMI_DeviceId, ch+1, preset, &Current); |
| SetCtrlVal(pa, PA_VSET, Voltage); |
| SetCtrlVal(pa, PA_ISET, Current); |
| |
| break; |
| } |
| return 0; |
| } |
| |
| |
| #define tcpChk(f) if ((g_TCPError=(f)) < 0) {ReportTCPError(); return -1; } |
| |
| /*---------------------------------------------------------------------------*/ |
| /* Module-globals */ |
| /*---------------------------------------------------------------------------*/ |
| static unsigned int g_hconversation; |
| static int g_TCPError = 0; |
| |
| int main (int argc, char *argv[]) |
| { |
| /*---------------------------------------------------------------------------*/ |
| /* Internal function prototypes */ |
| /*---------------------------------------------------------------------------*/ |
| /*---------------------------------------------------------------------------*/ |
| /* Report TCP Errors if any */ |
| /*---------------------------------------------------------------------------*/ |
| static void ReportTCPError (void) { |
| if (g_TCPError < 0) { |
| char messageBuffer[1024]; |
| sprintf(messageBuffer, |
| "TCP library error message: %s\nSystem error message: %s", |
| GetTCPErrorString (g_TCPError), GetTCPSystemErrorString()); |
| MessagePopup ("Error", messageBuffer); |
| } |
| } |
| |
| |
| int CVICALLBACK ServerTCPCB (unsigned handle, int event, int error, |
| void *callbackData) { |
| char receiveBuf[256] = {0}; |
| ssize_t dataSize = sizeof (receiveBuf) - 1; |
| char addrBuf[31]; |
| |
| switch (event) { |
| case TCP_CONNECT: |
| if (g_hconversation) { |
| /* We already have one client, don't accept another... */ |
| tcpChk (GetTCPPeerAddr (handle, addrBuf, 31)); |
| sprintf (receiveBuf, "-- Refusing conection request from " |
| "%s --\n", addrBuf); |
| printf("%s\n", receiveBuf); |
| tcpChk (DisconnectTCPClient (handle)); |
| } else { |
| /* Handle this new client connection */ |
| g_hconversation = handle; |
| tcpChk (GetTCPPeerAddr (g_hconversation, addrBuf, 31)); |
| printf("%s\n", addrBuf); |
| tcpChk (GetTCPPeerName (g_hconversation, receiveBuf, 256)); |
| printf("%s\n", receiveBuf); |
| sprintf (receiveBuf, "-- New connection from %s --\n", |
| addrBuf); |
| printf("%s\n", receiveBuf); |
| |
| /* Set the disconect mode so we do not need to terminate */ |
| /* connections ourselves. */ |
| tcpChk (SetTCPDisconnectMode (g_hconversation, TCP_DISCONNECT_AUTO)); |
| } |
| break; |
| case TCP_DATAREADY: |
| if ((dataSize = ServerTCPRead (g_hconversation, receiveBuf, dataSize, 1000)) < 0) { |
| printf("Receive Error\n"); |
| } else { |
| receiveBuf[dataSize] = '\0'; |
| printf("Received %s\n", receiveBuf); |
| } |
| break; |
| case TCP_DISCONNECT: |
| if (handle == g_hconversation) { |
| /* The client we were talking to has disconnected... */ |
| g_hconversation = 0; |
| printf("-- Client disconnected --\n"); |
| |
| /* Note that we do not need to do any more because we set the*/ |
| /* disconnect mode to AUTO. */ |
| } |
| break; |
| } |
| return 0; |
| } |
| |
| |
| |
| |
| |
| int main (int argc, char *argv[]) { |
| int DeviceId=0; |
| unsigned char ch; |
| unsigned char MainOutput, preset; |
| double Voltage, Current, tinterval; |
| char str[0xFF]; |
| double Voltage, Current, tinterval; |
| char str[0xFF]; |
| if (InitCVIRTE (0, argv, 0) == 0) |
| return -1; /* out of memory */ |
| SetStdioPort (CVI_STDIO_WINDOW); |
| pid.iGain= 0.3; |
| pid.dGain= 0.5; |
| pid.pGain = 3; |
| SetStdioPort (CVI_STDIO_WINDOW); |
| pid.iGain= 0.1; |
| pid.dGain= 2; |
| pid.pGain = 5; |
| pid.iMax =100; |
| pid.iMin =-100 ; |
| pid.iState=0; |
| 136,33 → 211,55 |
| |
| if ((pa = LoadPanel (0, "TempCtrl.uir", PA)) < 0) |
| return -1; |
| DisableBreakOnLibraryErrors(); |
| if (TMI_Open()== 0) MessagePopup("Error","Cannot open USB device"); |
| DeviceId = TMI_OpenHandle ("PW-A","USB:1:1"); |
| if (TMI_Test() == 0 )MessagePopup("DLL error","Dll Error"); |
| if (DeviceId < 0) MessagePopup("Error","Not Connected"); |
| printf("TMI device ID %d\n",TMI_DeviceId); |
| |
| if (TMI_Open()== 0) MessagePopup("Error","Cannot open USB device"); |
| DeviceId = TMI_OpenHandle ("PW-A","USB:1:1"); |
| if (TMI_Test() == 0 )MessagePopup("DLL error","Dll Error"); |
| if (DeviceId < 0) MessagePopup("Error","Not Connected"); |
| printf("TMI device ID %d\n",TMI_DeviceId); |
| |
| TMI_MainOutputQ(TMI_DeviceId, &MainOutput); |
| TMI_MainOutputQ(TMI_DeviceId, &MainOutput); |
| TMI_PresetQ(TMI_DeviceId, &preset); |
| SetCtrlVal(pa, PA_ONOFF, MainOutput); |
| SetCtrlVal(pa, PA_PRESET, preset); |
| SetCtrlVal(pa, PA_ONOFF, MainOutput); |
| SetCtrlVal(pa, PA_PRESET, preset); |
| /* |
| GetCtrlVal(pa, P1_TINTERVAL, &tinterval); |
| SetCtrlAttribute (pa, P1_TIMER, ATTR_INTERVAL, tinterval); |
| */ |
| SelectChannelCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| GetCtrlVal(pa, P1_TINTERVAL, &tinterval); |
| SetCtrlAttribute (pa, P1_TIMER, ATTR_INTERVAL, tinterval); |
| */ |
| |
| SetWaitCursor (1); |
| int portNum = 10000; |
| int registered = 0; |
| char tempBuf[256] = {0}; |
| if (RegisterTCPServer (portNum, ServerTCPCB, 0) < 0) |
| MessagePopup("TCP Server", "Server registration failed!"); |
| else { |
| SetWaitCursor (0); |
| registered = 1; |
| |
| /* We are successfully connected -- gather info */ |
| |
| if (GetTCPHostAddr (tempBuf, 256) >= 0) printf("%s\n" ,tempBuf); |
| if (GetTCPHostName (tempBuf, 256) >= 0) printf("%s\n" ,tempBuf); |
| |
| |
| |
| } |
| |
| SelectChannelCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| |
| |
| |
| |
| |
| |
| DisplayPanel (pa); |
| SetDimming(0); |
| RunUserInterface (); |
| CloseCom(COM_PORT); |
| if (registered) |
| UnregisterTCPServer (portNum); |
| DiscardPanel (pa); |
| TMI_Close(); |
| if (gFp) fclose(gFp); |
| TMI_Close(); |
| if (gFp) fclose(gFp); |
| return 0; |
| } |
| |
| 180,17 → 277,15 |
| |
| |
| int CVICALLBACK SwitchOnOffCB (int panel, int control, int event, |
| void *callbackData, int eventData1, int eventData2) |
| { |
| unsigned char state; |
| switch (event) |
| { |
| case EVENT_COMMIT: |
| GetCtrlVal(panel, control, &state); |
| TMI_MainOutput(TMI_DeviceId, state); |
| break; |
| } |
| return 0; |
| void *callbackData, int eventData1, int eventData2) { |
| unsigned char state; |
| switch (event) { |
| case EVENT_COMMIT: |
| GetCtrlVal(panel, control, &state); |
| TMI_MainOutput(TMI_DeviceId, state); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| 197,7 → 292,7 |
| |
| /* Callback Function */ |
| void ComCallback(int portNumber, int eventMask, void *callbackdata) { |
| |
| static double told=0; |
| if (eventMask & LWRS_RXFLAG) { |
| //printf("Received specified character\n"); |
| int strLen = GetInQLen (COM_PORT); |
| 209,14 → 304,14 |
| //printf("%f#%s#", temp, read_data); |
| sscanf(read_data,"%lf %lf %lf %lf %lf %lf",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5]); |
| double humidity = f[5]; |
| // printf("%lf %lf %lf %lf %lf %lf",f[0],f[1],f[2],f[3],f[4],f[5]); |
| // printf("%lf %lf %lf %lf %lf %lf",f[0],f[1],f[2],f[3],f[4],f[5]); |
| int RS232Error = ReturnRS232Err (); |
| if (ReturnRS232Err ()) { |
| sprintf(read_data,"#%s\n", GetRS232ErrorString(RS232Error)); |
| MessagePopup("RS232Err",read_data); |
| } else { |
| |
| |
| |
| |
| int polar; |
| SelectChannelCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| 224,38 → 319,45 |
| unsigned char ch, preset; |
| GetCtrlVal(pa,PA_TSET,&tset); |
| GetCtrlVal(pa,PA_VMON,&vmon); |
| GetCtrlVal(pa,PA_IMON,&imon); |
| GetCtrlVal(pa,PA_IMON,&imon); |
| GetCtrlVal(pa,PA_CHANNEL, &ch); |
| GetCtrlVal(pa,PA_PRESET,&preset); |
| TMI_Preset(TMI_DeviceId,preset); |
| GetCtrlVal(pa,PA_POLAR,&polar); |
| |
| |
| double tdiff = temp - tset; |
| double retpid = UpdatePID(&pid, tdiff, temp); |
| double retpid = UpdatePID(&pid, tdiff, temp); |
| const double troom = 20; |
| double Pheat= 0.2 * (temp - troom); |
| double Ptec = retpid - Pheat*2; |
| vset = (polar*Ptec>0) ? sqrt(fabs(Ptec)) : 0; |
| if (debug1) printf("%d PID tmon=%f tset=%f tdiff=%f vmon=%f imom=%f pid=%f Pheat=%f =>vset %f", ch, temp, tset, tdiff, vmon, imon,retpid ,Pheat, vset); |
| GetCtrlVal(pa,PA_VMAX,&vmax); |
| if (debug1) printf("%d PID tmon=%f tset=%f tdiff=%f vmon=%f imom=%f pid=%f Pheat=%f =>vset %f", ch, temp, tset, tdiff, vmon, imon,retpid ,Pheat, vset); |
| GetCtrlVal(pa,PA_VMAX,&vmax); |
| if (vset >vmax) vset=vmax; |
| if (vset <0) vset =0; |
| if (debug1) printf("vset --->%f \n",vset); |
| if (debug1) printf("vset --->%f \n",vset); |
| TMI_Voltage(TMI_DeviceId, ch+1, preset, vset); |
| GetCtrlVal(pa,PA_IMAX,&iset); |
| TMI_Current(TMI_DeviceId, ch+1, preset, iset); |
| |
| |
| |
| |
| |
| TMI_Current(TMI_DeviceId, ch+1, preset, iset); |
| |
| |
| |
| |
| |
| ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0); |
| |
| |
| PlotStripChart (pa, PA_GRAPH, &temp, 1, 0, 0, VAL_DOUBLE); |
| double pgraph[2]={vmon,imon}; |
| PlotStripChart (pa, PA_GRAPH_VMON, pgraph, 2, 0, 0, VAL_DOUBLE); |
| double pgraph[3]= {vmon,imon, 100*(temp-told)}; |
| PlotStripChart (pa, PA_GRAPH_VMON, pgraph, 3, 0, 0, VAL_DOUBLE); |
| PlotStripChart (pa, PA_GRAPH_3, &humidity, 1, 0, 0, VAL_DOUBLE); |
| SetCtrlVal(pa,PA_TMON,temp); |
| |
| SetCtrlVal(pa,PA_HUMIDITY,humidity); |
| |
| char transmitBuf[512]= {0}; |
| sprintf(transmitBuf, "%u %f %f %f %f\n", time(NULL), humidity, temp, tdiff, temp-told); |
| if (g_hconversation) |
| if ( ServerTCPWrite (g_hconversation, transmitBuf, strlen (transmitBuf), 1000) < 0) printf("Transmit Error\n"); |
| int log=0; |
| GetCtrlVal(pa,PA_LOG, &log); |
| if (log) { |
| 262,10 → 364,11 |
| char fname[0xFF]; |
| GetCtrlVal(pa,PA_FNAME, fname); |
| FILE *fp = fopen (fname,"a"); |
| fprintf(fp, "%u 0 %f\n", time(NULL), temp); |
| fprintf(fp,transmitBuf); |
| fclose(fp); |
| |
| } |
| told= temp; |
| |
| } |
| } |
| 322,14 → 425,15 |
| void *callbackData, int eventData1, int eventData2) { |
| |
| switch (event) { |
| case EVENT_COMMIT:{ |
| case EVENT_COMMIT: { |
| unsigned char preset; |
| double Voltage, Current; |
| GetCtrlVal(panel, control, &preset); |
| GetCtrlVal(panel, control, &preset); |
| TMI_Preset(TMI_DeviceId, preset); |
| |
| |
| break; |
| } |
| } |
| return 0; |
| } |
| |