📄 cup_connection.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Cup_Connection.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "OptoSnapIoMemMapXLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//TOptoSnapIoMemMapX *OptoSnapIoMemMapX1;
//---------------------------------------------------------------------------
long __fastcall TForm1:: GetAna_inModule012Value(tagSIOMM_AnaInMod012 *pAnaInMod012Data )
//得到0、1、2路模拟输入的值
{
long nResult;
tagSIOMM_AnaBank AnaInBankData; //tagSIOMM_AnaBank是64个元素的fvalue类型数组
nResult = OptoSnapIoMemMapX1->GetAnaBankValuesEx(&AnaInBankData);
//GetAnaBankValuesEx是获得整个模拟BANK的值
for(int i=0;i<12;i++)
pAnaInMod012Data->fValue[i]= AnaInBankData.fValue[i];
//将AnaInBankData中前12个元素取到pAnaInMod012Data中,一个模块占4元素
return nResult;
}
long __fastcall TForm1:: GetDig_inModule_N_States(long ModuleNumber,bool half_Bank,long * pDigInMod_N_States)
//第N路模块采集进来的4路数字信号
{
long nResult;
long DighBankstates;
tagSIOMM_DigBankReadArea DigBankReadData;
nResult = OptoSnapIoMemMapX1->GetDigBankReadAreaEx(&DigBankReadData);
if((half_Bank&&((ModuleNumber<8)|(ModuleNumber>15)))|((!half_Bank)&&((ModuleNumber<0)|(ModuleNumber>7))))
// half_Bank==1时指高8位模块,half_Bank==0时指低8位模块
{
nResult = User_Error1;
return nResult ;
} //报错
else
{
if(half_Bank)
{
ModuleNumber = ModuleNumber-8;
DighBankstates = DigBankReadData.nStatePts63to32;
}
else
DighBankstates = DigBankReadData.nStatePts31to0;
switch (ModuleNumber)
{
case 0:
* pDigInMod_N_States = DighBankstates & 0x0000000F;
break;
case 1:
* pDigInMod_N_States = DighBankstates & 0x000000F0;
break;
case 2:
* pDigInMod_N_States = DighBankstates & 0x00000F00;
break;
case 3:
* pDigInMod_N_States = DighBankstates & 0x0000F000;
break;
case 4:
* pDigInMod_N_States = DighBankstates & 0x000F0000;
break;
case 5:
* pDigInMod_N_States = DighBankstates & 0x00F00000;
break;
case 6:
* pDigInMod_N_States = DighBankstates & 0x0F000000;
break;
case 7:
* pDigInMod_N_States = DighBankstates & 0xF0000000;
break;
default:
* pDigInMod_N_States = DighBankstates & 0x0000000F;
//若无任何分支与表达式的值相匹配,则执行该分支
break;
}
return nResult;
}
}
long __fastcall TForm1::SetAna_OutModule_N_Value(long ModuleNumber,tagSIOMM_AnaOutSingleMod * AnaOutModSiData)
{
long nResult;
nResult = OptoSnapIoMemMapX1->SetAnaPtValue(4*ModuleNumber,AnaOutModSiData->fValue[0]);
nResult = OptoSnapIoMemMapX1->SetAnaPtValue(4*ModuleNumber+1,AnaOutModSiData->fValue[1]);
//将读进来的数安放在0~63合适的位置,数值放在fvalue中,位置由模块数决定
return nResult;
}
void __fastcall TForm1::HandleError(long nResult)
{
AnsiString GetResultAsString;
switch (nResult)
{
case SIOMM_OK :
GetResultAsString = "Ok";
break;
case SIOMM_ERROR :
GetResultAsString = "General error";
break;
case SIOMM_TIME_OUT :
GetResultAsString = "Timeout";
break;
case SIOMM_ERROR_NO_SOCKETS :
GetResultAsString = "No sockets";
break;
case SIOMM_ERROR_CREATING_SOCKET :
GetResultAsString = "Could not create socket to Snap I/O";
break;
case SIOMM_ERROR_CONNECTING_SOCKET :
GetResultAsString = "Could not connect socket to Snap I/O";
break;
case SIOMM_ERROR_RESPONSE_BAD :
GetResultAsString = "Bad response";
break;
case SIOMM_ERROR_NOT_CONNECTED_YET :
GetResultAsString = "Not connected yet";
break;
case SIOMM_ERROR_OUT_OF_MEMORY :
GetResultAsString = "ActiveX out of memory";
break;
case SIOMM_ERROR_NOT_CONNECTED :
GetResultAsString = "Not connected";
break;
case SIOMM_BRAIN_ERROR_UNDEFINED_CMD :
GetResultAsString = "Snap I/O Error: Undefined Command";
break;
case SIOMM_BRAIN_ERROR_INVALID_PT_TYPE :
GetResultAsString = "Snap I/O Error: Invalid point type";
break;
case SIOMM_BRAIN_ERROR_INVALID_FLOAT :
GetResultAsString = "Snap I/O Error: Invalid float";
break;
case SIOMM_BRAIN_ERROR_PUC_EXPECTED :
GetResultAsString = "Snap I/O Error: Powerup Clear expected";
break;
case SIOMM_BRAIN_ERROR_INVALID_ADDRESS :
GetResultAsString = "Snap I/O Error: Invalid memory address";
break;
case SIOMM_BRAIN_ERROR_INVALID_CMD_LENGTH :
GetResultAsString = "Snap I/O Error: Invalid command length";
break;
case SIOMM_BRAIN_ERROR_RESERVED :
GetResultAsString = "Snap I/O Error: Reserved";
break;
case SIOMM_BRAIN_ERROR_BUSY :
GetResultAsString = "Snap I/O Error: Busy";
break;
case SIOMM_BRAIN_ERROR_CANT_ERASE_FLASH :
GetResultAsString = "Snap I/O Error: Cannot erase flash";
break;
case SIOMM_BRAIN_ERROR_CANT_PROG_FLASH :
GetResultAsString = "Snap I/O Error: Cannot program flash";
break;
case SIOMM_BRAIN_ERROR_IMAGE_TOO_SMALL :
GetResultAsString = "Snap I/O Error: Downloaded imaged too small";
break;
case SIOMM_BRAIN_ERROR_IMAGE_CRC_MISMATCH :
GetResultAsString = "Snap I/O Error: Image CRC mismatch";
break;
case SIOMM_BRAIN_ERROR_IMAGE_LEN_MISMATCH :
GetResultAsString = "Snap I/O Error: Image length mismatch";
break;
case User_Error1:
GetResultAsString = "Invalid Digital Module number";
default :
GetResultAsString = "Unknown error";
break;
}
if(nResult == SIOMM_OK)
{
Error_Message->Text = GetResultAsString;
Error_Message->Color = clWhite ;
}
else
{
Error_Message->Color = clRed ;
OptoSnapIoMemMapX1->Close();
Error_Message->Text = GetResultAsString+" !" +"\r\n" + "Disconnection !";
}
}
//---------------------------------------------------------------------------
long __fastcall TForm1::PtConfigure(void)
{
long nResult;
int i;
//Configure the AI Channels —Module 0,1,2
for(i=0;i<4;i++) //4->12***********************
{
nResult = OptoSnapIoMemMapX1->SetAnaPtConfiguration(i,11,0,0,100,-100);
} //only configure module 0
//High Density digital point donot need configure.—Module 3,4
//Configure the A0 Channels —Module 5,6,7
for(i=24;i<28;i++) //24->20,28->32*****************************
{
nResult = OptoSnapIoMemMapX1->SetAnaPtConfiguration(i,0xA7,0,0,100,-100);
}
return nResult;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::GetDig_inModuleStates(long ModuleNumber,bool half_Bank,long nStatePts)
//将DI/O采集到的数转为ASCII码
{
char phBankstates[32];
int pMstr_len;
AnsiString pMstring,InsertString ;
if((half_Bank&&((ModuleNumber<8)|(ModuleNumber>15)))|((!half_Bank)&&((ModuleNumber<0)|(ModuleNumber>7))))
{
Error_Message->Text = "Wrong Module Number !";
pMstring = "xxxx";
return pMstring;
}
else
{
if(half_Bank)
ModuleNumber = ModuleNumber-8;
switch(ModuleNumber)
{
case 0:
itoa((nStatePts & 0x0000000F),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
//创建一个32-pMstr_len长度的全零字符串
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(29,4);
break;
case 1:
itoa((nStatePts & 0x000000F0),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);//
pMstring = pMstring.SubString(25,4); //数组起始元素编号为1,因此是丛第25个元素开始往后截4个元素
break;
case 2:
itoa((nStatePts & 0x00000F00),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(21,4);
break;
case 3:
itoa((nStatePts & 0x0000F000),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(17,4);
break;
case 4:
itoa((nStatePts & 0x000F0000),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(13,4);
break;
case 5:
itoa((nStatePts & 0x00F00000),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(9,4);
break;
case 6:
itoa((nStatePts & 0x0F000000),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(5,4);
break;
case 7:
itoa((nStatePts & 0xF0000000),phBankstates,2);//将数据转为32BIT的二进制字符串
pMstring = phBankstates;
pMstr_len = pMstring.Length();
InsertString = AnsiString::StringOfChar('0',32-pMstr_len);
pMstring.Insert(InsertString,1);
pMstring = pMstring.SubString(1,4);
break;
default:
Error_Message->Text = "Wrong Module Number !";
pMstring = "xxxx";
break;
}
return pMstring;
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Error_Message->Text = "Disconnection !";
DataProcess->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ConnectClick(TObject *Sender)
{
long nResult;
nResult = OptoSnapIoMemMapX1->OpenEnet2(WideString(IP_Address->Text), (Port_Number->Text).ToInt(),100000,1,SIOMM_TCP); //ToInt是指取整
if (SIOMM_OK == nResult)
{
// Keep calling IsOpenDone() until we connect or error
nResult = OptoSnapIoMemMapX1->IsOpenDone();//Use after a call to OpenEnet2() to check whether theconnection process is completed
DWORD StartTime = GetTickCount(); //提供计时功能
//if the connection time exceeds 3000 ms,then disable connection and quit.
while ((nResult != SIOMM_OK)&&((GetTickCount()-StartTime)<3000))
{
nResult = OptoSnapIoMemMapX1->IsOpenDone();
}
//在时间没溢出前一直等待正确的回应,如果有,连接成功,否则失败
// Check the final result from IsOpenDone()
if (SIOMM_OK == nResult)
{
Error_Message->Text = "Connection OK !\n";
Error_Message->Color = clWhite ;
DataProcess->Enabled = true;
}
else
{
Error_Message->Text = "Connection OverTime !\n";
Error_Message->Color = clRed ;
HandleError(nResult);
}
}
else
HandleError(nResult);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisconnectClick(TObject *Sender)
{
long nResult;
nResult = OptoSnapIoMemMapX1->Close();
if (SIOMM_OK == nResult)
{
Error_Message->Text = "Disconnection ok !";
Error_Message->Color = clWhite ;
DataProcess->Enabled = false;//断开连接后无法使用窗口2
}
else HandleError(nResult);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
OptoSnapIoMemMapX1->Close();
Error_Message->Text = "Disconnection !";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DataProcessClick(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -