/********************************************************************************************** * * isegCANHVCon.cpp : Defines the entry point for the console application. * Small demonstration program of the CAN communication between a Peak PCI or * USB interface and the iseg Multi-Channel HV modules. * * company iseg Spezialelektronik GmbH * written by Jens Roemer 2011 * jens.roemer@iseg-hv.de *----------------------------------------------------------------------------------- */ #include "stdafx.h" #include #include bool Shut=true; THVModule *HVModule; CHVMod24f *HVMod24f; TNominals Nominal; TChFloatNominals FNominal; void Output(char code, float val) { switch (code) { case 'U': printf("V set %3.3fV\n", val); break; case 'V': printf("V meas %3.3fV\n", val); break; case 'I': printf("I set %3.3fmA\n", val); break; case 'T': printf("I trip %3.3fmA\n", val); break; case 'C': printf("I meas %3.6fmA\n", val); break; case 'R': printf("Ramp speed %3.3fV/s\n", val); break; case 'E': printf("Ramp speed %3.3f%%\n", val); break; case 'O': if ((uw16)val) printf("On\n"); else printf("Off\n"); break; case 'S': printf("Status %x\n", uw16(val)); break; } } uw8 GetInp(uw8 chn) { char inp[128]; cin >> inp; switch (toupper(inp[0])) { case 'C': //new channel printf("Channel="); cin >> inp; if (HVModule && (atoi(inp)GetDevIDR().ChNb) ) chn=atoi(inp); else if (HVMod24f && (atoi(inp)GetDcpDevIDR().ChNb) ) chn=atoi(inp); break; case 'V': //new Vset printf("Vset="); cin >> inp; if (HVModule) HVModule->Chn[chn]->SetVset((uw32)(atof(inp)*HVModule->GetRes())/Nominal.V); else if (HVMod24f) { TChFloatVal ChFloatVal; ChFloatVal.V=atof(inp); HVMod24f->Chn[chn]->SetEdcpVset(ChFloatVal); } break; case 'I': //new Iset if ( (HVModule) && ( (HVModule->GetDevClass()==EHQ80_6kV) || (HVModule->GetDevClass()==EHQ80_6kV_F) ) ) { printf("Iset="); cin >> inp; if (HVModule) HVModule->Chn[chn]->SetIset((uw32)(atof(inp)*HVModule->GetRes())/Nominal.I); } else if (HVMod24f) { TChFloatVal ChFloatVal; printf("Iset="); cin >> inp; ChFloatVal.V=atof(inp); HVMod24f->Chn[chn]->SetEdcpIset(ChFloatVal); } break; case 'T': //new Itrip if ( (HVModule) && ( (HVModule->GetDevClass()==EHQ200) || (HVModule->GetDevClass()==EHQ80_1kV_F) || (HVModule->GetDevClass()==EHQ82_1kV_F) || (HVModule->GetDevClass()==EHQ80_MIX_F) ) ) { printf("Itrip="); cin >> inp; if (HVModule) HVModule->Chn[chn]->SetItrp((uw32)(atof(inp)*HVModule->GetRes())/Nominal.I); } break; case 'R': //new Ramp speed printf("Ramp speed="); cin >> inp; if (HVModule) HVModule->SetRamp((uw32)(atof(inp)*HVModule->GetRes())/Nominal.V); else if (HVMod24f) { TFloatVal FloatVal; FloatVal.V=atof(inp); HVMod24f->setEdcpRampV(FloatVal); } break; case 'O': //channel on if (HVModule) HVModule->SetOnOff(HVModule->GetOnOff().V|(1<setDcpOnOff(HVMod24f->getDcpOnOff()|(1<SetOnOff(HVModule->GetOnOff().V&(~(1<setDcpOnOff(HVMod24f->getDcpOnOff()&(~(1< Channel\n"); printf("V -> Vset\n"); if ( (HVModule) && ( (HVModule->GetDevClass()==EHQ80_6kV) || (HVModule->GetDevClass()==EHQ80_6kV_F) ) ) printf("I -> Iset\n"); else printf("T -> Itrip\n"); printf("R -> Ramp speed\n"); printf("O -> On\n"); printf("F -> Off\n"); printf("H, ? -> Help\n"); printf("N -> new display of measurements\n"); printf("Q -> Quit\n\n"); break; case 'N': break; case 'Q': Shut=true; break; //Shut } return chn; } int main(int argc, char* argv[]) { char CANClient[128]; DWORD hndl=1; uw8 chn; uw16 tout=0; uw16 id=0; uw8 stat; uw8 dev_class; char tstamp[20]; //Initialize of the PC CAN interface // PCI: Parameter PCAN_PCI // USB: Parameter PCAN_USB ConnectCANHw2Driver(PCAN_USB); ReInitCanSystem(0); strcpy(CANClient, "isegCANHVConsole"); if (!InitCan(0, 125, &hndl, CANClient)) //CANLine 1, BitRate 125kbit/s, Windows Handle, CANClient "isegCANHVTest" //Result: if return true -> CANClient: Client isegCANHVTest // if return false -> error message { printf("%s - push any key to stop", CANClient); while (!kbhit()) {}; exit(1); } Sleep(2000); //scan log-on frames from bus HVModule=NULL; HVMod24f=NULL; while (CanLogOnOff(&id, &stat, &dev_class, tstamp)) { if ((!HVModule) && (!HVMod24f)) { //the first HV module that has been scanned from bus will be used //to create a class for the later communication id&=0x7fe; //masking of DATA_DIR bit switch (dev_class) { case EHQ200: HVModule = new THVModule(id, 16, dev_class); HVModule->SetLogOn(connect); //set in state connect break; // create class HVModule with 16 HV channels case EHQ80_6kV: case EHQ80_1kV_F: case EHQ82_1kV_F: case EHQ80_6kV_F: HVModule = new THVModule(id, 8, dev_class); // create class HVModule with 8 HV channels HVModule->SetLogOn(connect); //set in state connect break; case E16D0: case E08C0: case E08F0: case E08F2: case E08C2: case E08B0: HVMod24f = new CHVMod24f(id, 8, dev_class); // create class HVModule with 8 to 16 HV channels HVMod24f->setDcpLogOn(connect); //set in state connect break; } Shut=false; } else CanLogOnOff(id&0x7fe, connect); //all other HV modules will be set in state connect also Sleep(10); if (tout<200) tout++; else { Shut=true; break; } id=0; } if (Shut) { printf("No HV module has been scaned from bus - push any key to stop!"); while (!kbhit()) {}; } //display of the items Vset, Vmeas, Iset or Itrip, Imeas, Ramp spead, On of Off chn=0; while (!Shut) { if ( (HVModule) && ( (HVModule->GetDevClass()==EHQ80_6kV) || (HVModule->GetDevClass()==EHQ80_MIX_F) || (HVModule->GetDevClass()==EHQ80_6kV_F) ) ) Nominal=HVModule->Chn[chn]->GetNominal(); else if (HVModule && HVModule->GetDevClass()==EHQ200) Nominal=HVModule->GetNominal(); /*else FNominal=HVMod24f->GetEdcpVNominalP();*/ if (HVModule) { Output('U', (float)(HVModule->Chn[chn]->GetVset().V * Nominal.V)/HVModule->GetRes()); Output('V', (float)(HVModule->Chn[chn]->GetVmeas().V * Nominal.V)/HVModule->GetRes()); if ( (HVModule->GetDevClass()==EHQ80_6kV) || (HVModule->GetDevClass()==EHQ80_6kV_F) ) Output('I', (float)(HVModule->Chn[chn]->GetIset().V * Nominal.I)/HVModule->GetRes()); else Output('T', (float)(HVModule->Chn[chn]->GetItrp().V * Nominal.I)/HVModule->GetRes()); Output('C', (float)(HVModule->Chn[chn]->GetImeas().V * Nominal.I)/HVModule->GetRes()); Output('R', (float)(HVModule->GetRamp().V * Nominal.V)/HVModule->GetRes()); Output('O', (float)HVModule->GetOnOff().V); Output('S', HVModule->Chn[chn]->GetStat().V); } else { //HVMod24f->S SetChn(0); Output('U', (float)HVMod24f->Chn[chn]->GetEdcpVset().V ); Output('V', (float)HVMod24f->Chn[chn]->GetEdcpVmeas().V); Output('I', (float)HVMod24f->Chn[chn]->GetEdcpIset().V); Output('C', (float)HVMod24f->Chn[chn]->GetEdcpImeas().V); Output('E', (float)HVMod24f->getEdcpRampV().V); Output('O', (float)HVMod24f->getDcpOnOff()); Output('S', HVMod24f->Chn[chn]->GetEdcpStat().Stat.Word); } chn=GetInp(chn); } if (HVModule) HVModule->SetLogOn(disconnect); else if (HVMod24f) HVMod24f->setDcpLogOn(disconnect); Sleep(10); ReInitCanSystem(0); return 0; }