Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "K6517-ctrl.h"
  2. #include <tcpsupp.h>
  3. #include <rs232.h>
  4. #include <utility.h>
  5. #include <userint.h>
  6. #include <ansi_c.h>
  7. #include "K2231A.h"
  8.  
  9. #include "TempCtrl.h"
  10. FILE *gFp;
  11.  
  12. #define RSTREG(a,x) (a&=(~(x)))
  13. #define SETREG(a,x) (a|=x)
  14.  
  15. int gMask=0xF;
  16.  
  17. static int pa;
  18.  
  19. #define TEXT_LENGTH     2000
  20. char read_data[TEXT_LENGTH];
  21.  
  22. int read_term_index;
  23. int read_term;
  24. int read_cnt;
  25. int bytes_read;
  26.  
  27. #define COM_PORT 11
  28.  
  29.  
  30. typedef struct {
  31.         double dState;          // Last temperature input
  32.         double iState;          // Integrator state
  33.         double iMax, iMin;      // Maximum and minimum allowable integrator state
  34.         double  iGain,          // integral gain
  35.                                         pGain,          // proportional gain
  36.                                         dGain;          // derivative gain
  37. } SPid;
  38.  
  39. SPid pid;
  40.  
  41. double UpdatePID(SPid *pid, double error, double temperature) {
  42.         double pTerm, dTerm, iTerm;
  43.         pTerm = pid->pGain * error;
  44.         // calculate the proportional term
  45.         // calculate the integral state with appropriate limiting
  46.         pid->iState += error;
  47.         if (pid->iState > pid->iMax)      pid->iState = pid->iMax;
  48.         else if (pid->iState < pid->iMin) pid->iState = pid->iMin;
  49.         //if (debug )
  50.         iTerm = pid->iGain * pid->iState;  // calculate the integral term
  51.         dTerm = pid->dGain * (temperature - pid->dState);
  52.         pid->dState = temperature;
  53.         return pTerm + iTerm - dTerm;
  54. }
  55.  
  56. void SetDimming(int state) {
  57.         SetCtrlAttribute (pa, PA_START, ATTR_DIMMED, state);
  58.         SetCtrlAttribute (pa, PA_EXIT, ATTR_DIMMED, state);
  59.         SetCtrlAttribute (pa, PA_STOP, ATTR_DIMMED, !state);
  60. }
  61.  
  62.  
  63.  
  64. int CVICALLBACK ReadVoltageCurrentCB (int panel, int control, int event,
  65.                                                                                                                                                         void *callbackData, int eventData1, int eventData2) {
  66.  
  67.         int iRet;
  68.         char ch=0;
  69.         double Voltage;
  70.         double Current;
  71.         char cv_cc;
  72.         switch (event) {
  73.                 case EVENT_COMMIT:
  74.            
  75.                         GetCtrlVal(pa,PA_CHANNEL, &ch);
  76.             char cmd[0xFF];
  77.  
  78.                         K2231A_SelectChannel(ch+1);                  
  79.                         cv_cc = K2231A_GetOperationMode();
  80.                         Voltage =K2231A_GetVoltageMonitor();
  81.                         Current =K2231A_GetCurrentMonitor();
  82.            
  83.            
  84.  
  85.                         SetCtrlVal(panel, PA_VMON, Voltage);
  86.                         SetCtrlVal(panel, PA_IMON, Current);
  87.                         SetCtrlVal(panel, PA_CVCC, cv_cc);
  88.  
  89.                         break;
  90.         }
  91.         return 0;
  92. }
  93.  
  94.  
  95. int CVICALLBACK SelectChannelCB (int panel, int control, int event,
  96.                                                                                                                                  void *callbackData, int eventData1, int eventData2) {
  97.         unsigned char state, preset;
  98.         double Voltage, Current;
  99.         unsigned char ch;
  100.         switch (event) {
  101.                 case EVENT_COMMIT:
  102.                         GetCtrlVal(pa,PA_CHANNEL, &ch);
  103.  
  104.  
  105.                         K2231A_SelectChannel(ch+1);
  106.       Voltage =K2231A_GetSetVoltage();
  107.                         Current =K2231A_GetSetCurrent();
  108.            
  109.                         SetCtrlVal(pa, PA_VSET, Voltage);
  110.                         SetCtrlVal(pa, PA_ISET, Current);
  111.  
  112.                         break;
  113.         }
  114.         return 0;
  115. }
  116.  
  117. int SetCooling(char onoff){
  118.         int nb=0;
  119.   nb = ComWrt (COM_PORT, &onoff, 1);  
  120.         return nb;
  121. }
  122.  
  123. #define tcpChk(f) if ((g_TCPError=(f)) < 0) {ReportTCPError(); return -1; }
  124.  
  125. /*---------------------------------------------------------------------------*/
  126. /* Module-globals                                                            */
  127. /*---------------------------------------------------------------------------*/
  128. static unsigned int g_hconversation;
  129. static int                      g_TCPError = 0;
  130.  
  131. /*---------------------------------------------------------------------------*/
  132. /* Internal function prototypes                                              */
  133. /*---------------------------------------------------------------------------*/
  134. /*---------------------------------------------------------------------------*/
  135. /* Report TCP Errors if any                                                                      */
  136. /*---------------------------------------------------------------------------*/
  137. static void ReportTCPError (void) {
  138.         if (g_TCPError < 0) {
  139.                 char    messageBuffer[1024];
  140.                 sprintf(messageBuffer,
  141.                                                 "TCP library error message: %s\nSystem error message: %s",
  142.                                                 GetTCPErrorString (g_TCPError), GetTCPSystemErrorString());
  143.                 MessagePopup ("Error", messageBuffer);
  144.         }
  145. }
  146.  
  147.  
  148. int CVICALLBACK ServerTCPCB (unsigned handle, int event, int error,
  149.                                                                                                                  void *callbackData) {
  150.         char receiveBuf[256] = {0};
  151.         ssize_t dataSize        = sizeof (receiveBuf) - 1;
  152.         char addrBuf[31];
  153.  
  154.         switch (event) {
  155.                 case TCP_CONNECT:
  156.                         if (g_hconversation) {
  157.                                 /* We already have one client, don't accept another... */
  158.                                 tcpChk (GetTCPPeerAddr (handle, addrBuf, 31));
  159.                                 sprintf (receiveBuf, "-- Refusing conection request from "
  160.                                                                  "%s --\n", addrBuf);
  161.                                 printf("%s\n", receiveBuf);
  162.                                 tcpChk (DisconnectTCPClient (handle));
  163.                         } else {
  164.                                 /* Handle this new client connection */
  165.                                 g_hconversation = handle;
  166.                                 tcpChk (GetTCPPeerAddr (g_hconversation, addrBuf, 31));
  167.                                 printf("%s\n", addrBuf);
  168.                                 tcpChk (GetTCPPeerName (g_hconversation, receiveBuf, 256));
  169.                                 printf("%s\n", receiveBuf);
  170.                                 sprintf (receiveBuf, "-- New connection from %s --\n",
  171.                                                                  addrBuf);
  172.                                 printf("%s\n", receiveBuf);
  173.  
  174.                                 /* Set the disconect mode so we do not need to terminate */
  175.                                 /* connections ourselves. */
  176.                                 tcpChk (SetTCPDisconnectMode (g_hconversation, TCP_DISCONNECT_AUTO));
  177.                         }
  178.                         break;
  179.                 case TCP_DATAREADY:
  180.                         if ((dataSize = ServerTCPRead (g_hconversation, receiveBuf, dataSize, 1000)) < 0) {
  181.                                 printf("Receive Error\n");
  182.                         } else {
  183.                                 receiveBuf[dataSize] = '\0';
  184.                                 printf("Received %s\n", receiveBuf);
  185.                                 int cmd=0;
  186.                                 float arg;
  187.                                 sscanf(receiveBuf,"%d%f",&cmd,&arg);
  188.                                 switch (cmd){
  189.                                         case 1:
  190.                                                 SetCtrlVal(pa,PA_TSET,arg);
  191.                                                 break;
  192.                                         default:
  193.                                                 break;
  194.                                  
  195.                                 }
  196.                         }
  197.                         break;
  198.                 case TCP_DISCONNECT:
  199.                         if (handle == g_hconversation) {
  200.                                 /* The client we were talking to has disconnected... */
  201.                                 g_hconversation = 0;
  202.                                 printf("-- Client disconnected --\n");
  203.  
  204.                                 /* Note that we do not need to do any more because we set the*/
  205.                                 /* disconnect mode to AUTO. */
  206.                         }
  207.                         break;
  208.         }
  209.         return 0;
  210. }
  211.  
  212.  
  213.  
  214.  
  215.  
  216. int main (int argc, char *argv[]) {
  217.         int DeviceId=0;
  218.         unsigned char ch;
  219.         unsigned char MainOutput, preset=1;
  220.         double Voltage, Current, tinterval;
  221.         char str[0xFF];
  222.         if (InitCVIRTE (0, argv, 0) == 0)
  223.                 return -1;      /* out of memory */
  224.         SetStdioPort (CVI_STDIO_WINDOW);
  225.         pid.iGain= 0.1;
  226.         pid.dGain= 2;
  227.         pid.pGain = 5;
  228.         pid.iMax =100;
  229.         pid.iMin =-100 ;
  230.         pid.iState=0;
  231.         pid.dState=0;
  232.  
  233.         if ((pa = LoadPanel (0, "TempCtrl.uir", PA)) < 0)
  234.                 return -1;
  235.         DisableBreakOnLibraryErrors();
  236.         K2231A_SetPort(6);
  237.   K2231A_SetDebug(1);
  238.         if (K2231A_Open()== 0) MessagePopup("Error","Cannot open USB device");
  239.         K2231A_Test();
  240.         MainOutput = K2231A_GetSwitch();
  241.         SetCtrlVal(pa, PA_ONOFF, MainOutput);
  242.         SetCtrlVal(pa, PA_PRESET, preset);
  243.        
  244.         int debug1;
  245.         GetCtrlVal(pa,PA_DEBUG_1, &debug1);
  246.         K2231A_SetDebug(1);
  247.         SetCtrlVal(pa,PA_CHANNEL, 0);
  248.         /*
  249.         GetCtrlVal(pa, P1_TINTERVAL, &tinterval);
  250.         SetCtrlAttribute (pa, P1_TIMER, ATTR_INTERVAL, tinterval);
  251.         */
  252.  
  253.         SetWaitCursor (1);
  254.         int portNum = 10000;
  255.         int              registered = 0;
  256.         char     tempBuf[256] = {0};
  257.         if (RegisterTCPServer (portNum, ServerTCPCB, 0) < 0)
  258.                 MessagePopup("TCP Server", "Server registration failed!");
  259.         else {
  260.                 SetWaitCursor (0);
  261.                 registered = 1;
  262.  
  263.                 /* We are successfully connected -- gather info */
  264.  
  265.                 if (GetTCPHostAddr (tempBuf, 256) >= 0) printf("%s\n" ,tempBuf);
  266.                 if (GetTCPHostName (tempBuf, 256) >= 0) printf("%s\n" ,tempBuf);
  267.  
  268.  
  269.  
  270.         }
  271.  
  272.         SelectChannelCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0);
  273.         ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0);
  274.  
  275.  
  276.  
  277.         DisplayPanel (pa);
  278.         SetDimming(0);
  279.         RunUserInterface ();
  280.         CloseCom(COM_PORT);
  281.         if (registered)
  282.                 UnregisterTCPServer (portNum);
  283.         DiscardPanel (pa);
  284.         K2231A_Close();
  285.         if (gFp)  fclose(gFp);
  286.         return 0;
  287. }
  288.  
  289.  
  290. int CVICALLBACK ExitCB (int panel, int control, int event,
  291.                                                                                                 void *callbackData, int eventData1, int eventData2) {
  292.         switch (event) {
  293.                 case EVENT_COMMIT:
  294.                         QuitUserInterface (0);
  295.                         break;
  296.         }
  297.         return 0;
  298. }
  299.  
  300. int CVICALLBACK SwitchCoolingOnOffCB (int panel, int control, int event,
  301.                                                                                                                          void *callbackData, int eventData1, int eventData2) {
  302.         int onoff=0;
  303.  
  304.         switch (event) {
  305.                 case EVENT_COMMIT:
  306.                         GetCtrlVal(pa,control,&onoff);
  307.                         SetCooling(onoff);
  308.                        
  309.                         break;
  310.         }
  311.         return 0;
  312. }
  313.  
  314. int CVICALLBACK SwitchOnOffCB (int panel, int control, int event,
  315.                                                                                                                          void *callbackData, int eventData1, int eventData2) {
  316.         unsigned char state;
  317.         switch (event) {
  318.                 case EVENT_COMMIT:
  319.                         GetCtrlVal(panel, control, &state);
  320.                         K2231A_SetSwitch(state);
  321.                         break;
  322.         }
  323.         return 0;
  324. }
  325.  
  326.  
  327.  
  328. /* Callback Function */
  329. void ComCallback(int portNumber, int eventMask, void *callbackdata) {
  330.         static double told=0;
  331.         if (eventMask & LWRS_RXFLAG) {
  332. //printf("Received specified character\n");
  333.                 int strLen = GetInQLen (COM_PORT);
  334.                 bytes_read = ComRd (COM_PORT, read_data, strLen);
  335.                 double temp= atof(read_data);
  336.                 double f[10];
  337.                 int debug1;
  338.                 GetCtrlVal(pa,PA_DEBUG_1, &debug1);
  339.                 K2231A_SetDebug(debug1);
  340. //printf("%f#%s#", temp, read_data);
  341.                 // temp1 , temp2 , temp3 , temp4 , temp humidity sens, rel.humidity
  342.                 if (bytes_read >0) {
  343.                         SetCtrlVal(pa,PA_ARDUINO, read_data);
  344.                 }      
  345.                 sscanf(read_data,"%lf %lf %lf %lf %lf %lf",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5]);
  346.                 double humidity = f[5];
  347.                 double htemp = f[4];
  348. //              printf("%lf %lf %lf %lf %lf %lf",f[0],f[1],f[2],f[3],f[4],f[5]);
  349.                 int RS232Error = ReturnRS232Err ();
  350.                 if (ReturnRS232Err ()) {
  351.                         sprintf(read_data,"#%s\n", GetRS232ErrorString(RS232Error));
  352.                         MessagePopup("RS232Err",read_data);
  353.                 } else {
  354.  
  355.  
  356.                         int polar;
  357.                
  358.                         ProcessSystemEvents ();
  359.                         SelectChannelCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0);
  360.                         ProcessSystemEvents ();
  361.                         ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0);
  362.                         ProcessSystemEvents ();
  363.                         double tset,vmon,imon,vset,iset,vmax;
  364.                         unsigned char ch, preset;
  365.                         GetCtrlVal(pa,PA_TSET,&tset);
  366.                         GetCtrlVal(pa,PA_VMON,&vmon);
  367.                         GetCtrlVal(pa,PA_IMON,&imon);
  368.                         GetCtrlVal(pa,PA_CHANNEL, &ch);
  369.                         //GetCtrlVal(pa,PA_PRESET,&preset);
  370.                         //TMI_Preset(TMI_DeviceId,preset);
  371.                         GetCtrlVal(pa,PA_POLAR,&polar);
  372.  
  373.                         double tdiff = temp - tset;
  374.                         double retpid  = UpdatePID(&pid, tdiff, temp);
  375.                         const double troom = htemp;
  376.                         double Pheat= 0.2 * (temp - troom);
  377.                         double Ptec = retpid  - Pheat*2;
  378.                         vset = (polar*Ptec>0) ? sqrt(fabs(Ptec)) : 0;
  379.                         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);
  380.                         GetCtrlVal(pa,PA_VMAX,&vmax);
  381.                         if (vset >vmax) vset=vmax;
  382.                         if (vset <0) vset =0;
  383.                         if (debug1) printf("vset --->%f \n",vset);
  384.             K2231A_SelectChannel(ch+1);
  385.             K2231A_SetVoltage(vset);
  386.                        
  387.                         GetCtrlVal(pa,PA_IMAX,&iset);
  388.            
  389.             K2231A_SetCurrent(iset);
  390.                
  391.  
  392.                         ReadVoltageCurrentCB (pa, PA_CHANNEL, EVENT_COMMIT, NULL, 0,0);
  393.  
  394.                         PlotStripChart (pa, PA_GRAPH, &temp, 1, 0, 0, VAL_DOUBLE);
  395.                         double pgraph[3]= {vmon,imon, 100*(temp-told)};
  396.                         PlotStripChart (pa, PA_GRAPH_VMON, pgraph, 3, 0, 0, VAL_DOUBLE);
  397.                         PlotStripChart (pa, PA_GRAPH_3, &humidity, 1, 0, 0, VAL_DOUBLE);
  398.                         SetCtrlVal(pa,PA_TMON,temp);
  399.                         SetCtrlVal(pa,PA_HTMON,htemp);  
  400.                         SetCtrlVal(pa,PA_HUMIDITY,humidity);
  401.  
  402.                         char transmitBuf[512]= {0};
  403.                         sprintf(transmitBuf, "%u %f %f %f %f\n", time(NULL), humidity, temp, tdiff, temp-told);
  404.                         if (g_hconversation)
  405.                                 if ( ServerTCPWrite (g_hconversation, transmitBuf, strlen (transmitBuf), 1000) < 0) printf("Transmit Error\n");
  406.                         int log=0;
  407.                         GetCtrlVal(pa,PA_LOG, &log);
  408.                         if (log) {
  409.                                 char fname[0xFF];
  410.                                 GetCtrlVal(pa,PA_FNAME, fname);
  411.                                 FILE *fp = fopen (fname,"a");
  412.                                 fprintf(fp,transmitBuf);
  413.                                 fclose(fp);
  414.  
  415.                         }
  416.                         told= temp;
  417.  
  418.                 }
  419.         }
  420.  
  421.         if (eventMask & LWRS_TXEMPTY)
  422.  
  423.                 printf("Transmit queue now empty\n");
  424.  
  425.         if (eventMask & LWRS_RECEIVE) {
  426.  
  427.                 printf("50 or more bytes in input queue\n");
  428.  
  429.         }
  430.  
  431. }
  432.  
  433.  
  434. int CVICALLBACK StartCB (int panel, int control, int event,
  435.                                                                                                  void *callbackData, int eventData1, int eventData2) {
  436.         switch (event) {
  437.                 case EVENT_COMMIT:
  438.                         OpenComConfig (COM_PORT, "", 115200, 0, 8, 1, 512, 512);
  439.                         /*      Turn off Hardware handshaking (loopback test will not function with it on) */
  440.                         SetCTSMode (COM_PORT, LWRS_HWHANDSHAKE_OFF);
  441.  
  442.                         /*      Make sure Serial buffers are empty */
  443.                         FlushInQ (COM_PORT);
  444.                         FlushOutQ (COM_PORT);
  445.  
  446.                         int notifyCount = 50; /* Wait for at least 50 bytes in queue. */
  447.                         int eventChar = 10; /* Wait for LF. */
  448.                         int eventMask = LWRS_RXFLAG | LWRS_TXEMPTY | LWRS_RECEIVE;
  449.                         InstallComCallback (COM_PORT, eventMask, notifyCount, eventChar, ComCallback, NULL);
  450.                         SetDimming(1);
  451.  
  452.                         break;
  453.         }
  454.         return 0;
  455. }
  456.  
  457.  
  458. int CVICALLBACK StopCB (int panel, int control, int event,
  459.                                                                                                 void *callbackData, int eventData1, int eventData2) {
  460.         switch (event) {
  461.                 case EVENT_COMMIT:
  462.                         CloseCom(COM_PORT);
  463.                         SetDimming(0);
  464.                         break;
  465.         }
  466.         return 0;
  467. }
  468.  
  469. int CVICALLBACK SetPresetCB (int panel, int control, int event,
  470.                                                                                                                  void *callbackData, int eventData1, int eventData2) {
  471.  
  472.         switch (event) {
  473.                 case EVENT_COMMIT: {
  474.                         unsigned char preset;
  475.                         double Voltage, Current;
  476.                         GetCtrlVal(panel, control, &preset);
  477.                         K2231A_RecallFromMemory(preset);
  478.  
  479.                         break;
  480.                 }
  481.         }
  482.         return 0;
  483. }
  484.  
  485.