//--------------------------------------------------------------------------- #include #pragma hdrstop #include "main.h" #include "pisocpm100.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TSDO_Demo *SDO_Demo; Byte Board,NodeId,Baudrate; unsigned int MsgCnt; AnsiString tempstr; //--------------------------------------------------------------------------- __fastcall TSDO_Demo::TSDO_Demo(TComponent* Owner) : TForm(Owner) { Board = 0; NodeId = 1; Baudrate = 0; Cmb_Board->Enabled = true; Cmb_Baudrate->Enabled = true; Btn_Configure->Enabled = true; Cmb_NodeId->Enabled = false; Btn_Shutdown->Enabled = false; Btn_AddNode->Enabled = false; Btn_Remove->Enabled = false; Btn_Read->Enabled = false; Btn_Write->Enabled = false; Btn_Clear->Enabled = false; Edit_Index->Enabled = false; Edit_SubIndex->Enabled = false; Edit_WData->Enabled = false; } //--------------------------------------------------------------------------- //-------------- If Board Combo box has been click ------------// void __fastcall TSDO_Demo::OnBoardClick(TObject *Sender) { Board = Cmb_Board->ItemIndex; } //--------------------------------------------------------------------------- //-------------- If Board Combo box lose focus ------------// void __fastcall TSDO_Demo::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 TSDO_Demo::OnBaudrateClick(TObject *Sender) { Baudrate = Cmb_Baudrate->ItemIndex; } //--------------------------------------------------------------------------- //-------------- If Baudrate Combo box lose focus ------------// void __fastcall TSDO_Demo::OnBaudrateExit(TObject *Sender) { Cmb_Baudrate->ItemIndex = Baudrate; } //--------------------------------------------------------------------------- //-------------- If Node Id Combo box has been click ------------// void __fastcall TSDO_Demo::OnNodeidClick(TObject *Sender) { NodeId = Cmb_NodeId->ItemIndex; if(NodeId == 0) NodeId = 1; } //--------------------------------------------------------------------------- //-------------- If Node Id Combo box lose focus ------------// void __fastcall TSDO_Demo::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; } NodeId = TempNodeId; Cmb_NodeId->ItemIndex = NodeId; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_ConfigureClick(TObject *Sender) { int ret; ret = CPM100_ActiveBoard(Board); if(ret){ tempstr = "Active Board failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } ret = CPM100_InitMaster(Board,Baudrate); if(ret){ tempstr = "Initialize Master failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } Cmb_Board->Enabled = false; Cmb_Baudrate->Enabled = false; Btn_Configure->Enabled = false; Cmb_NodeId->Enabled = true; Btn_Shutdown->Enabled = true; Btn_AddNode->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_ShutdownClick(TObject *Sender) { int ret; ret = CPM100_ShutdownMaster(Board); if(ret){ tempstr = "Master shutdown failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } ret = CPM100_CloseBoard(Board); if(ret){ tempstr = "Close board failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } Cmb_Board->Enabled = true; Cmb_Baudrate->Enabled = true; Btn_Configure->Enabled = true; Cmb_NodeId->Enabled = false; Btn_Shutdown->Enabled = false; Btn_AddNode->Enabled = false; Btn_Remove->Enabled = false; Btn_Read->Enabled = false; Btn_Write->Enabled = false; Btn_Clear->Enabled = false; Edit_Index->Enabled = false; Edit_SubIndex->Enabled = false; Edit_WData->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_AddNodeClick(TObject *Sender) { int ret; ret = CPM100_AddNode(Board,NodeId); if(ret){ tempstr = "Node add failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } MsgCnt = 0; // Clear the TMemo object "Mem_Receive" Mem_Receive->Clear(); Cmb_NodeId->Enabled = false; Btn_AddNode->Enabled = false; Btn_Remove->Enabled = true; Btn_Read->Enabled = true; Btn_Write->Enabled = true; Btn_Clear->Enabled = true; Edit_Index->Enabled = true; Edit_SubIndex->Enabled = true; Edit_WData->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_RemoveClick(TObject *Sender) { int ret; ret = CPM100_RemoveNode(Board,NodeId); if(ret){ tempstr = "Node remove failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } Cmb_NodeId->Enabled = true; Btn_AddNode->Enabled = true; Btn_Remove->Enabled = false; Btn_Read->Enabled = false; Btn_Write->Enabled = false; Btn_Clear->Enabled = false; Edit_Index->Enabled = false; Edit_SubIndex->Enabled = false; Edit_WData->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_ReadClick(TObject *Sender) { int ret,i; Byte SubIndex,RData[100]; Word Index,RDatalen; AnsiString SDOString; Index = (Word)StrToInt("0x" + Edit_Index->Text.Trim()); // Convert string to Hex SubIndex = (Byte)StrToInt("0x" + Edit_SubIndex->Text.Trim()); // Convert string to Hex ret = CPM100_SDOReadData(Board,NodeId,Index,SubIndex,&RDatalen,RData); if(ret){ tempstr = "Read SDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } MsgCnt = MsgCnt + 1; SDOString = IntToStr(MsgCnt) + " -- "; for(i=0;iLines->Append(SDOString); // Add new line to the Mem_Recive } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_WriteClick(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_WData->Text.Trim(); WDatalen=0; // To check the data if useful for(i=1;i<=Edit_WData->Text.Length();i++){ if((Edit_WData->Text[i] >= 0x30)&&(Edit_WData->Text[i] <= 0x39) || // 0x30 ~ 0x39 = '0' ~ '9' (Edit_WData->Text[i] >= 0x41)&&(Edit_WData->Text[i] <= 0x46) || // 0x41 ~ 0x46 = 'A' ~ 'F' (Edit_WData->Text[i] >= 0x61)&&(Edit_WData->Text[i] <= 0x66)){ // 0x61 ~ 0x66 = 'a' ~ 'f' if(i+1 <= Edit_WData->Text.Length()){ if((Edit_WData->Text[i+1] >= 0x30)&&(Edit_WData->Text[i+1] <= 0x39) || (Edit_WData->Text[i+1] >= 0x41)&&(Edit_WData->Text[i+1] <= 0x46) || (Edit_WData->Text[i+1] >= 0x61)&&(Edit_WData->Text[i+1] <= 0x66)){ WData[WDatalen++] = StrToInt("0x" + Edit_WData->Text.SubString(i,2)); i++; } else{ WData[WDatalen++] = StrToInt("0x" + Edit_WData->Text.SubString(i,1)); } } else{ WData[WDatalen++] = StrToInt("0x" + Edit_WData->Text.SubString(i,1)); } } } // If Edit_WData = "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_WData = " A BB C DD" // the WData(0) = 0x0A, WData(1) = 0xBB, WData(2) = 0x0C, WData(3) = 0xDD ret = CPM100_SDOWriteData(Board,NodeId,Index,SubIndex,WDatalen,WData,&RDatalen,RData); if(ret){ tempstr = "Write SDO failure, error = " + IntToStr(ret); MessageBox(NULL,tempstr.c_str(),"Error",0); return; } MsgCnt = MsgCnt + 1; SDOString = IntToStr(MsgCnt) + " -- "; for(i=0;iLines->Append(SDOString); // Add new line to the Mem_Recive } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::Btn_ClearClick(TObject *Sender) { Mem_Receive->Clear(); MsgCnt = 0; } //--------------------------------------------------------------------------- void __fastcall TSDO_Demo::OnProgramClose(TObject *Sender, TCloseAction &Action) { CPM100_ShutdownMaster(Board); CPM100_CloseBoard(Board); } //---------------------------------------------------------------------------