//--------------------------------------------------------------------------- #include #pragma hdrstop #include "main.h" #include "pisocpm100.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TCPM_TestProg *CPM_TestProg; AnsiString tempstr; Byte BOARD = 0; Byte NODE = 1; Byte BAUDRATE = 0; Byte NodeIsExist[128]; // If node has been added, the data is 1 else 0 Word GuardingTime[128]; // If node has been guarded, the data is guarding time else 0 Word RecenItem = 0; // EMCY/PDO message item //--------------------------------------------------------------------------- //***************** HMI Interface *************** void __fastcall TCPM_TestProg::WhenCloseBoard(void) { Btn_ActiveBoard->Caption = "Active Board"; Cmb_Board->Enabled = true; Cmb_Baudrate->Enabled = true; //--- Disable All Button & ComboBox Cmb_NodeId->Enabled = false; Cmb_NodeState->Enabled = false; Cmb_PDOCh->Enabled = false; Cmb_IOType->Enabled = false; Cmb_RxTxType->Enabled = false; Cmb_PDOEntry->Enabled = false; Cmb_Offset->Enabled = false; Edit_GuardTime->Enabled = false; Edit_Index->Enabled = false; Edit_SubIndex->Enabled = false; Edit_WSDOData->Enabled = false; Edit_PDOData->Enabled = false; Edit_PDOId->Enabled = false; Edit_SYNCId->Enabled = false; Edit_Cyclic->Enabled = false; Edit_SetupPDO->Enabled = false; Edit_PDOIndex->Enabled = false; Edit_IOCh1->Enabled = false; Edit_IOCh2->Enabled = false; Edit_NewCobId->Enabled = false; Edit_EventTimer->Enabled = false; Edit_TxType->Enabled = false; Edit_NewPDO->Enabled = false; Edit_IOValue->Enabled = false; Btn_AddNode->Caption = "Add Node"; Btn_AddNode->Enabled = false; Btn_SetState->Enabled = false; Btn_GetState->Enabled = false; Btn_Guarding->Enabled = false; Btn_ReadSDO->Enabled = false; Btn_WriteSDO->Enabled = false; Btn_AbortSDO->Enabled = false; Btn_PDORtr->Enabled = false; Btn_PDOOutput->Enabled = false; Btn_DynamicPDO->Enabled = false; Btn_InstallPDO->Enabled = false; Btn_RemovePDO->Enabled = false; Btn_SendSync->Enabled = false; Btn_StopSync->Enabled = false; Btn_ChangeSYNCId->Enabled = false; Btn_ChangeEMCYId->Enabled = false; Btn_SetEventTimer->Enabled = false; Btn_SetTxType->Enabled = false; Btn_ChangePDOId->Enabled = false; Btn_DO->Enabled = false; Btn_DI->Enabled = false; Btn_AO->Enabled = false; Btn_AI->Enabled = false; Timer1->Interval = 0; Mem_Receive->Clear(); //m_static_addnode.SetBitmap(m_static_red.GetBitmap()); //---------------------------------------- } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::WhenActiveBoard(void) { Btn_ActiveBoard->Caption = "Close Board"; Cmb_Board->Enabled = false; Cmb_Baudrate->Enabled = false; //--- Enable Add Node Button & ComboBox Cmb_NodeId->Enabled = true; Btn_AddNode->Enabled = true; //---------------------------------------- RecenItem = 0; Timer1->Interval = 10; } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::WhenAddNode(void) { Btn_AddNode->Caption = "Remove"; Cmb_NodeState->Enabled = true; Cmb_PDOCh->Enabled = true; Cmb_IOType->Enabled = true; Cmb_RxTxType->Enabled = true; Cmb_PDOEntry->Enabled = true; Cmb_Offset->Enabled = true; Edit_GuardTime->Enabled = true; Edit_Index->Enabled = true; Edit_SubIndex->Enabled = true; Edit_WSDOData->Enabled = true; Edit_PDOData->Enabled = true; Edit_PDOId->Enabled = true; Edit_SYNCId->Enabled = true; Edit_Cyclic->Enabled = true; Edit_SetupPDO->Enabled = true; Edit_PDOIndex->Enabled = true; Edit_IOCh1->Enabled = true; Edit_IOCh2->Enabled = true; Edit_NewCobId->Enabled = true; Edit_EventTimer->Enabled = true; Edit_TxType->Enabled = true; Edit_NewPDO->Enabled = true; Edit_IOValue->Enabled = true; Btn_SetState->Enabled = true; Btn_GetState->Enabled = true; Btn_Guarding->Enabled = true; Btn_ReadSDO->Enabled = true; Btn_WriteSDO->Enabled = true; Btn_AbortSDO->Enabled = true; Btn_PDORtr->Enabled = true; Btn_PDOOutput->Enabled = true; Btn_DynamicPDO->Enabled = true; Btn_InstallPDO->Enabled = true; Btn_RemovePDO->Enabled = true; Btn_SendSync->Enabled = true; Btn_ChangeSYNCId->Enabled = true; Btn_ChangeEMCYId->Enabled = true; Btn_SetEventTimer->Enabled = true; Btn_SetTxType->Enabled = true; Btn_ChangePDOId->Enabled = true; Btn_DO->Enabled = true; Btn_DI->Enabled = true; Btn_AO->Enabled = true; Btn_AI->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::WhenRemoveNode(void) { Btn_AddNode->Caption = "Add Node"; Cmb_NodeState->Enabled = false; Cmb_PDOCh->Enabled = false; Cmb_IOType->Enabled = false; Cmb_RxTxType->Enabled = false; Cmb_PDOEntry->Enabled = false; Cmb_Offset->Enabled = false; Edit_GuardTime->Enabled = false; Edit_Index->Enabled = false; Edit_SubIndex->Enabled = false; Edit_WSDOData->Enabled = false; Edit_PDOData->Enabled = false; Edit_PDOId->Enabled = false; Edit_SYNCId->Enabled = false; Edit_Cyclic->Enabled = false; Edit_SetupPDO->Enabled = false; Edit_PDOIndex->Enabled = false; Edit_IOCh1->Enabled = false; Edit_IOCh2->Enabled = false; Edit_NewCobId->Enabled = false; Edit_EventTimer->Enabled = false; Edit_TxType->Enabled = false; Edit_NewPDO->Enabled = false; Edit_IOValue->Enabled = false; Btn_SetState->Enabled = false; Btn_GetState->Enabled = false; Btn_Guarding->Enabled = false; Btn_ReadSDO->Enabled = false; Btn_WriteSDO->Enabled = false; Btn_AbortSDO->Enabled = false; Btn_PDORtr->Enabled = false; Btn_PDOOutput->Enabled = false; Btn_DynamicPDO->Enabled = false; Btn_InstallPDO->Enabled = false; Btn_RemovePDO->Enabled = false; Btn_SendSync->Enabled = false; Btn_StopSync->Enabled = false; Btn_ChangeSYNCId->Enabled = false; Btn_ChangeEMCYId->Enabled = false; Btn_SetEventTimer->Enabled = false; Btn_SetTxType->Enabled = false; Btn_ChangePDOId->Enabled = false; Btn_DO->Enabled = false; Btn_DI->Enabled = false; Btn_AO->Enabled = false; Btn_AI->Enabled = false; } //--------------------------------------------------------------------------- __fastcall TCPM_TestProg::TCPM_TestProg(TComponent* Owner) : TForm(Owner) { tempstr = "CPM_TestProg -- Driver Ver " + FormatFloat("0.00",CPM100_GetVersion()) + ", Total " + IntToStr(CPM100_TotalBoard()) + " Board"; this->Caption = tempstr; Cmb_Board->ItemIndex = 0; Cmb_Baudrate->ItemIndex = 0; Cmb_NodeId->ItemIndex = 0; Cmb_PDOCh->ItemIndex = 0; Cmb_IOType->ItemIndex = 0; Cmb_RxTxType->ItemIndex = 0; Cmb_PDOEntry->ItemIndex = 0; Cmb_Offset->ItemIndex = 0; memset(NodeIsExist,0,128); memset(GuardingTime,0,128); Shp_LED->Brush->Color = clRed; WhenCloseBoard(); } //--------------------------------------------------------------------------- //-------------- If Board Combo box has been click ------------// void __fastcall TCPM_TestProg::OnBoardClick(TObject *Sender) { BOARD = Cmb_Board->ItemIndex; } //--------------------------------------------------------------------------- //-------------- If Board Combo box lose focus ------------// void __fastcall TCPM_TestProg::OnBoardExit(TObject *Sender) { int TempBoard; TempBoard = StrToInt(Cmb_Board->Text); if(TempBoard > 15){ // The range of Board number is 0 ~ 15 TempBoard = 15; } BOARD = TempBoard; Cmb_Board->ItemIndex = BOARD; } //--------------------------------------------------------------------------- //-------------- If Baudrate Combo box has been click ------------// void __fastcall TCPM_TestProg::OnBaudrateClick(TObject *Sender) { BAUDRATE = Cmb_Baudrate->ItemIndex; } //--------------------------------------------------------------------------- //-------------- If Baudrate Combo box lose focus ------------// void __fastcall TCPM_TestProg::OnBaudrateExit(TObject *Sender) { Cmb_Baudrate->ItemIndex = BAUDRATE; } //--------------------------------------------------------------------------- //-------------- If Node Id Combo box has been click ------------// void __fastcall TCPM_TestProg::OnNodeidClick(TObject *Sender) { NODE = Cmb_NodeId->ItemIndex + 1; if(NODE == 0) NODE = 1; if(NodeIsExist[NODE]){ // Node is added Shp_LED->Brush->Color = clLime; WhenAddNode(); Btn_GetStateClick(Sender); } else{ // Node isn't added Shp_LED->Brush->Color = clRed; WhenRemoveNode(); } Edit_GuardTime->Text = IntToStr(GuardingTime[NODE]); } //--------------------------------------------------------------------------- //-------------- If Node Id Combo box lose focus ------------// void __fastcall TCPM_TestProg::OnNodeidExit(TObject *Sender) { int TempNodeId; TempNodeId = StrToInt(Cmb_NodeId->Text); if(TempNodeId > 127){ // The range of Node Id is 1 ~ 127 TempNodeId = 127; } else if(TempNodeId == 0){ TempNodeId = 1; } NODE = TempNodeId; Cmb_NodeId->ItemIndex = NODE - 1; } //*************************************************** //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_BoardInfoClick(TObject *Sender) { int ret; AnsiString boardinfo; DWord dwVID=0, dwDID=0, dwSVID=0, dwSDID=0, dwSAuxID=0, dwIrqNo=0; ret = CPM100_GetBoardInf(BOARD, &dwVID,&dwDID,&dwSVID,&dwSDID,&dwSAuxID,&dwIrqNo); if(ret){ tempstr = "Get Board Information failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr.printf(" Vendor ID = %X\n Device ID = %X\n Sub-Vendor ID = %X\n Sub-Device ID = %X\n Sub-Aux ID = %x\n Irq No. = %X", dwVID,dwDID,dwSVID,dwSDID,dwSAuxID,dwIrqNo); boardinfo = "Board " + IntToStr(BOARD) + " Information"; MessageBox(NULL,tempstr.c_str(),boardinfo.c_str(),MB_ICONINFORMATION); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_ActiveBoardClick(TObject *Sender) { int ret; if(Btn_ActiveBoard->Caption == "Active Board"){ ret = CPM100_ActiveBoard(BOARD); if(ret){ tempstr = "Active Board failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ ret = CPM100_InitMaster(BOARD,BAUDRATE); if(ret){ tempstr = "Initialize Master failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ WhenActiveBoard(); } } } else{ ret = CPM100_ShutdownMaster(BOARD); if(ret){ tempstr = "Master shutdow failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ ret = CPM100_CloseBoard(BOARD); if(ret){ tempstr = "Close board failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ memset(NodeIsExist,0,128); memset(GuardingTime,0,128); WhenCloseBoard(); } } } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_AddNodeClick(TObject *Sender) { int ret; if(Btn_AddNode->Caption == "Add Node"){ ret = CPM100_AddNode(BOARD,NODE); if(ret){ tempstr = "Node Add failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ NodeIsExist[NODE] = 1; this->OnNodeidClick(Sender); } } else{ ret = CPM100_RemoveNode(BOARD,NODE); if(ret){ tempstr = "Remove Node failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ NodeIsExist[NODE] = 0; GuardingTime[NODE] = 0; this->OnNodeidClick(Sender); } } } //--------------------------------------------------------------------------- //------------ NMT Protocol void __fastcall TCPM_TestProg::Btn_SetStateClick(TObject *Sender) { int ret; Byte State; switch(Cmb_NodeState->ItemIndex){ case 0: State = 0x1; // opernational break; case 1: State = 0x80; // pre-opernational break; case 2: State = 0x2; // node stop break; case 3: State = 0x81; // reset state break; } ret = CPM100_NMTChangeState(BOARD,NODE,State); if(ret){ tempstr = "Set Node state failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ if(State == 0x81) GuardingTime[NODE] = 0; } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_GetStateClick(TObject *Sender) { int ret; Byte State; ret = CPM100_NMTGetState(BOARD,NODE,&State); if(ret){ tempstr = "Get Node state failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ switch(State){ case 0x5: // opernational Cmb_NodeState->ItemIndex = 0; break; case 0x4: // node stop Cmb_NodeState->ItemIndex = 2; break; case 0x7f: // pre-opernational Cmb_NodeState->ItemIndex = 1; break; } } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_GuardingClick(TObject *Sender) { int ret; Word GuardTime; Byte LifeTime; GuardTime = (Word)StrToInt(Edit_GuardTime->Text); LifeTime = 3; ret = CPM100_NMTGuarding(BOARD,NODE,GuardTime,LifeTime); if(ret){ tempstr = "Set Guarding failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ GuardingTime[NODE] = GuardTime; tempstr = "Guarding Set OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //------------ End NMT Protocol //--------------------------------------------------------------------------- //------------ SYNC Protocol void __fastcall TCPM_TestProg::Btn_SendSyncClick(TObject *Sender) { int ret; Word Cobid; DWord SYNCTime; //The unit of Cyclic is 0.1ms SYNCTime = (DWord)StrToInt(Edit_Cyclic->Text); //The unit of Cyclic*10 is 1ms SYNCTime = SYNCTime*10; //If Cyclic is 0, the function will send SYNC message one time Cobid = (Word)StrToInt("0x" + Edit_SYNCId->Text); ret = CPM100_SendSYNC(BOARD,Cobid,SYNCTime); if(ret){ tempstr = "Set SYNC failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ if(SYNCTime){ Btn_SendSync->Enabled = false; Btn_StopSync->Enabled = true; } } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_StopSyncClick(TObject *Sender) { int ret; Word Cobid; DWord SYNCTime; SYNCTime = 0; Cobid = (Word)StrToInt("0x" + Edit_SYNCId->Text); ret = CPM100_SendSYNC(BOARD,Cobid,SYNCTime); if(ret){ tempstr = "Set SYNC failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ Btn_SendSync->Enabled = true; Btn_StopSync->Enabled = false; } } //------------ End SYNC Protocol //--------------------------------------------------------------------------- //------------ SDO Protocol void __fastcall TCPM_TestProg::Btn_ReadSDOClick(TObject *Sender) { int ret,i; Byte SubIndex,RData[100]; Word Index,RDatalen; AnsiString TempStr,SDOString; // Convert string to Hex Index = (Word)StrToInt("0x" + Edit_Index->Text.Trim()); // Convert string to Hex SubIndex = (Byte)StrToInt("0x" + Edit_SubIndex->Text.Trim()); ret = CPM100_SDOReadData(BOARD,NODE,Index,SubIndex,&RDatalen,RData); if(ret){ tempstr = "Read SDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } SDOString = "[" + IntToStr(RDatalen) + "]--"; for(i=0;iText = SDOString; } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_WriteSDOClick(TObject *Sender) { int ret,i; char TempChar[2]; Byte SubIndex,RData[100],WData[100]; Word Index,RDatalen,WDatalen; AnsiString SDOString; // Convert string to Hex Index = (Word)StrToInt("0x" + Edit_Index->Text.Trim()); // Convert string to Hex SubIndex = (Byte)StrToInt("0x" + Edit_SubIndex->Text.Trim()); // The format of Edit_WData is dd dd dd... Edit_WSDOData->Text.Trim(); WDatalen=0; // To check the data if useful for(i=1;i<=Edit_WSDOData->Text.Length();i++){ if((Edit_WSDOData->Text[i] >= 0x30)&&(Edit_WSDOData->Text[i] <= 0x39) || // 0x30 ~ 0x39 = '0' ~ '9' (Edit_WSDOData->Text[i] >= 0x41)&&(Edit_WSDOData->Text[i] <= 0x5A) || // 0x41 ~ 0x5A = 'A' ~ 'Z' (Edit_WSDOData->Text[i] >= 0x61)&&(Edit_WSDOData->Text[i] <= 0x7A)){ // 0x61 ~ 0x7A = 'a' ~ 'z' if(i+1 <= Edit_WSDOData->Text.Length()){ if((Edit_WSDOData->Text[i+1] >= 0x30)&&(Edit_WSDOData->Text[i+1] <= 0x39) || (Edit_WSDOData->Text[i+1] >= 0x41)&&(Edit_WSDOData->Text[i+1] <= 0x5A) || (Edit_WSDOData->Text[i+1] >= 0x61)&&(Edit_WSDOData->Text[i+1] <= 0x7A)){ WData[WDatalen++] = StrToInt("0x" + Edit_WSDOData->Text.SubString(i,2)); i++; } else{ WData[WDatalen++] = StrToInt("0x" + Edit_WSDOData->Text.SubString(i,1)); } } else{ WData[WDatalen++] = StrToInt("0x" + Edit_WSDOData->Text.SubString(i,1)); } } } // If Edit_WSDOData = "AA BB CC DD" or "AABBCCDD" or "AA,BB.CC-DD" // the WData(0) = 0xAA, WData(1) = 0xBB, WData(2) = 0xCC, WData(3) = 0xDD // If Edit_WSDOData = " A BB C DD" // the WData(0) = 0x0A, WData(1) = 0xBB, WData(2) = 0x0C, WData(3) = 0xDD ret = CPM100_SDOWriteData(BOARD,NODE,Index,SubIndex,WDatalen,WData,&RDatalen,RData); if(ret){ tempstr = "Write SDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } SDOString = "[" + IntToStr(RDatalen) + "]--"; for(i=0;iText = SDOString; } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_AbortSDOClick(TObject *Sender) { int ret; Byte SubIndex; Word Index; // Convert string to Hex Index = (Word)StrToInt("0x" + Edit_Index->Text.Trim()); // Convert string to Hex SubIndex = (Byte)StrToInt("0x" + Edit_SubIndex->Text.Trim()); ret = CPM100_SDOAbortTransmit(BOARD, NODE, Index, SubIndex); if(ret){ tempstr = "Abort SDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } } //------------ End SDO Protocol //--------------------------------------------------------------------------- //------------ PDO Protocol void __fastcall TCPM_TestProg::Btn_PDORtrClick(TObject *Sender) { int ret,i; WORD Cobid; BYTE RDatalen,RData[20]; DWORD UpperTime,LowerTime; double TimeStamp; AnsiString PDOString; // Convert string to Hex Cobid = (Word)StrToInt("0x" + Edit_PDOId->Text.Trim()); ret = CPM100_PDORemote(BOARD, Cobid, &RDatalen, RData, &UpperTime, &LowerTime); if(ret){ tempstr = "Read PDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ PDOString = "[" + IntToStr(RDatalen) + "]--"; if(RDatalen){ for(i=0;iText = PDOString; } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_PDOOutputClick(TObject *Sender) { int ret,i; Byte Offset,WDatalen,WData[8]; Word CobId; AnsiString PDOString; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_PDOId->Text.Trim()); // Convert string to Dec Offset = Cmb_Offset->ItemIndex; // The format of Edit_WData is dd dd dd... Edit_PDOData->Text.Trim(); WDatalen=0; // To check the data if useful for(i=1;i<=Edit_PDOData->Text.Length();i++){ if((Edit_PDOData->Text[i] >= 0x30)&&(Edit_PDOData->Text[i] <= 0x39) || // 0x30 ~ 0x39 = '0' ~ '9' (Edit_PDOData->Text[i] >= 0x41)&&(Edit_PDOData->Text[i] <= 0x5A) || // 0x41 ~ 0x5A = 'A' ~ 'Z' (Edit_PDOData->Text[i] >= 0x61)&&(Edit_PDOData->Text[i] <= 0x7A)){ // 0x61 ~ 0x7A = 'a' ~ 'z' if(i+1 <= Edit_PDOData->Text.Length()){ if((Edit_PDOData->Text[i+1] >= 0x30)&&(Edit_PDOData->Text[i+1] <= 0x39) || (Edit_PDOData->Text[i+1] >= 0x41)&&(Edit_PDOData->Text[i+1] <= 0x5A) || (Edit_PDOData->Text[i+1] >= 0x61)&&(Edit_PDOData->Text[i+1] <= 0x7A)){ WData[WDatalen++] = StrToInt("0x" + Edit_PDOData->Text.SubString(i,2)); i++; } else{ WData[WDatalen++] = StrToInt("0x" + Edit_PDOData->Text.SubString(i,1)); } } else{ WData[WDatalen++] = StrToInt("0x" + Edit_PDOData->Text.SubString(i,1)); } } } // If Edit_PDOData = "AA BB CC DD" or "AABBCCDD" or "AA,BB.CC-DD" // the WData(0) = 0xAA, WData(1) = 0xBB, WData(2) = 0xCC, WData(3) = 0xDD // If Edit_PDOData = " A BB C DD" // the WData(0) = 0x0A, WData(1) = 0xBB, WData(2) = 0x0C, WData(3) = 0xDD ret = CPM100_PDOWrite(BOARD,CobId,Offset,WDatalen,WData); if(ret){ tempstr = "Write PDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } } //------------ End PDO Protocol //--------------------------------------------------------------------------- //------------ PDO Setup void __fastcall TCPM_TestProg::Btn_DynamicPDOClick(TObject *Sender) { int ret; Byte RxTxType,PDOChannel,MappingData[4]; Word CobId; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); // PDO channel(entry number of the PDO) PDOChannel = Cmb_PDOCh->ItemIndex + 1; // Ex: If the PDO had two AO and two DO data, and you want to mapping a new DO(or AO) // data into the PDO, the parameter "PDOChannel" must be 5. Because the two AO // have two entry, and the two DO have two entry, too, so the new data must be // mapping at the fifth entry. // // PDO Data Byte : 0 1 2 3 4 5 6 7 // Before mapping : AO0_L AO0_H AO1_L AO1_H DO0 DO1 X X // After mapping new DO: AO0_L AO0_H AO1_L AO1_H DO0 DO1 DO2 X // After mapping new AO: AO0_L AO0_H AO1_L AO1_H DO0 DO1 AO2_L AO2_H // // Note: Every PDO has max. data is 8 bytes. // And a AO entry is two bytes, a DO entry is one byte. // I/O channel (sub-index of I/O index) MappingData[1] = (Byte)StrToInt("0x" + Edit_IOCh1->Text.Trim()); switch(Cmb_IOType->ItemIndex){ case 0: // DI MappingData[0] = 8; // DI data length (8 bit) MappingData[2] = 0x00; // Low byte of DI index MappingData[3] = 0x60; // High byte of DI index RxTxType = 1; // tx PDO break; case 1: // DO MappingData[0] = 8; // DO data length (8 bit) MappingData[2] = 0x00; // Low byte of DO index MappingData[3] = 0x62; // High byte of DO index RxTxType = 0; // rx PDO break; case 2: // AI MappingData[0] = 16; // AI data length (16 bit) MappingData[2] = 0x01; // Low byte of AI index MappingData[3] = 0x64; // High byte of AI index RxTxType = 1; // tx PDO break; case 3: // AO MappingData[0] = 16; // AO data length (16 bit) MappingData[2] = 0x11; // Low byte of AO index MappingData[3] = 0x64; // High byte of AO index RxTxType = 0; // rx PDO break; } ret = CPM100_DynamicPDO(BOARD,NODE,CobId,RxTxType,PDOChannel,MappingData); if(ret){ tempstr = "Dynamic PDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "Dynamic PDO OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_InstallPDOClick(TObject *Sender) { int ret; Word CobId,PDOIndex; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); // Convert string to Hex PDOIndex = (WORD)StrToInt("0x" + Edit_PDOIndex->Text.Trim()); ret = CPM100_InstallPDO(BOARD,NODE,CobId,PDOIndex); if(ret){ tempstr = "Install PDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "Install PDO OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_RemovePDOClick(TObject *Sender) { int ret; Byte RxTxType; // 0: is rx , 1: is tx Byte PDOEntry; Word CobId; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); RxTxType = Cmb_RxTxType->ItemIndex; PDOEntry = Cmb_PDOEntry->ItemIndex; ret = CPM100_RemovePDO(BOARD,NODE,CobId,RxTxType,PDOEntry); if(ret){ tempstr = "Remove PDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "Remove PDO OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_SetTxTypeClick(TObject *Sender) { int ret; Byte TxType; Word CobId; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); // Convert string to Dec TxType = (Byte)StrToInt(Edit_TxType->Text.Trim()); ret = CPM100_PDOTxType(BOARD, NODE, CobId, TxType); if(ret){ tempstr = "Transmission type set failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "Transmission type Set OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_SetEventTimerClick(TObject *Sender) { int ret; Word CobId,EventTimer; // Convert string to Hex CobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); // Convert string to Dec EventTimer = (Word)StrToInt(Edit_EventTimer->Text.Trim()); ret = CPM100_SetEventTimer(BOARD, NODE, CobId, EventTimer); if(ret){ tempstr = "EventTimer Set failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "EventTimer Set OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_ChangePDOIdClick(TObject *Sender) { int ret; Word oldCobId,newCobId; // Convert string to Hex oldCobId = (Word)StrToInt("0x" + Edit_SetupPDO->Text.Trim()); // Convert string to Hex newCobId = (Word)StrToInt("0x" + Edit_NewPDO->Text.Trim()); ret = CPM100_ChangePDOCobID(BOARD, NODE, oldCobId, newCobId); if(ret){ tempstr = "Change Cob ID failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "Cob ID change OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //------------ End PDO Setup //--------------------------------------------------------------------------- //------------ Change Cob ID void __fastcall TCPM_TestProg::Btn_ChangeSYNCIdClick(TObject *Sender) { int ret; Word CobId; CobId = (Word)StrToInt("0x" + Edit_NewCobId->Text.Trim()); ret = CPM100_ChangeSYNCID(BOARD,NODE,CobId); if(ret){ tempstr = "Change SYNC ID failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "SYNC ID Change OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_ChangeEMCYIdClick(TObject *Sender) { int ret; Word CobId; CobId = (Word)StrToInt("0x" + Edit_NewCobId->Text.Trim()); ret = CPM100_ChangeEMCYID(BOARD,NODE,CobId); if(ret){ tempstr = "Change EMCY ID failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "EMCY ID Change OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //------------ End Change Cob ID //--------------------------------------------------------------------------- //------------ I/O control void __fastcall TCPM_TestProg::Btn_DIClick(TObject *Sender) { int ret; Byte iochannel,value; // Convert string to Hex iochannel = (Byte)StrToInt("0x" + Edit_IOCh2->Text.Trim()); ret = CPM100_ReadDI(BOARD,NODE,iochannel,&value); if(ret){ tempstr = "Input DI failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ Edit_IOValue->Text = IntToHex(value,2) + " (Dec: " + IntToStr(value) +")"; } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_AIClick(TObject *Sender) { int ret; Byte iochannel; Word value; // Convert string to Hex iochannel = (Byte)StrToInt("0x" + Edit_IOCh2->Text.Trim()); ret = CPM100_ReadAI(BOARD,NODE,iochannel,&value); if(ret){ tempstr = "Input AI failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ Edit_IOValue->Text = IntToHex(value,4) + " (Dec: " + IntToStr(value) +")"; } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_DOClick(TObject *Sender) { int ret; Byte iochannel,value; // Convert string to Hex iochannel = (Byte)StrToInt("0x" + Edit_IOCh2->Text.Trim()); // Convert string to Hex value = (Byte)StrToInt("0x" + Edit_IOValue->Text.Trim()); ret = CPM100_WriteDO(BOARD,NODE,iochannel,value); if(ret){ tempstr = "Output DO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "DO output OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Btn_AOClick(TObject *Sender) { int ret; Byte iochannel; Word value; // Convert string to Hex iochannel = (Byte)StrToInt("0x" + Edit_IOCh2->Text.Trim()); // Convert string to Hex value = (Byte)StrToInt("0x" + Edit_IOValue->Text.Trim()); ret = CPM100_WriteAO(BOARD,NODE,iochannel,value); if(ret){ tempstr = "Output AO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); } else{ tempstr = "AO output OK"; MessageBox(NULL,tempstr.c_str(),"OK",0); } } //------------ End I/O control //--------------------------------------------------------------------------- void __fastcall TCPM_TestProg::Timer1Timer(TObject *Sender) { int ret,i,j,count; Byte EMCY_Data[8],PDO_Data[8],PDO_Len; Byte Node; Word Cob_Id; Word Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds; DWord UpperTime,LowerTime; double TimeStamp; AnsiString EMCYStr,PDOStr,TempStr; count = CPM100_ReadEMCYCount(BOARD); if(count){ for(i=0;i= 100){ Mem_Receive->Clear(); RecenItem = 0; } // Add new line to the Mem_Recive Mem_Receive->Lines->Append(EMCYStr); RecenItem++; } } } count = CPM100_ReadPDOCount(BOARD); if(count){ for(i=0;i= 100){ Mem_Receive->Clear(); RecenItem = 0; } // Add new line to the Mem_Recive Mem_Receive->Lines->Append(PDOStr); RecenItem++; } } } } //---------------------------------------------------------------------------