⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cup_connection.cpp

📁 一般OPTO22工业控制器主要用于IO控制,用途比较广泛而其上位机一般使用DELPHI平台或BCB平台进行建模和控制,该程序实现了OPTO和C++builder平台下上位机之间模拟量数字量的传输,并以
💻 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 + -