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

📄 cup_connection.pas

📁 一般OPTO22工业控制器主要用于IO控制,用途比较广泛而其上位机一般使用DELPHI平台或C平台进行建模和控制,该程序实现了OPTO和DELPHI平台下上位机之间模拟量数字量的传输,并以得到实际应用
💻 PAS
📖 第 1 页 / 共 2 页
字号:
end;
{----------------------------------------------------------------
 在此程序中,由于开始是写的 是function  GetAna_inModule012Value(pAnaInMod012Data:SIOMM_AnaInMod012)
 忽视了此时相当于在调用时调用的pAnaInMod012Data 是一个局部变量,当该程序结束后该变量也被释放
 因此后面程序无法正确读数。解决方法有二:1、像BCB一样使用指针,而读数调用函数时写入要存变量的地址,因此
 该函数直接对变量的地址进行修改,即使局部变量被释放,从地址读数仍然可以正确读出。2、不调用变量,而采用将
  pAnaInMod012Data 返回,让调用的函数直接读取。这样虽然效率不高,可是简单。第一种方法不会,需要研究。
----------------------------------------------------------------}
//----------------------得到0、1、2路模拟输入的值---------------------------
function TForm1.GetAna_inModule012Value():AnaIn_Result;

var
  nResult:Integer;
  i:Integer;
  AnaInBankData:SIOMM_AnaBank;//SIOMM_AnaBank是64个元素的fvalue类型数组
  AnaInResultData:AnaIn_Result;
begin
  AnaInResultData.nResult:= OptoSnapIoMemMapX1.GetAnaBankValuesEx(AnaInBankData);
  //GetAnaBankValuesEx是获得整个模拟BANK的值
  for i:=0 to 11 do
  AnaInResultData.pAnaInMod012Data.fValue[i]:= AnaInBankData.fValue[i];
  //将AnaInBankData中前12个元素取到pAnaInMod012Data中,一个模块占4元素
  Result:= AnaInResultData;
  exit;
end;
//--------------第N路模块采集进来的4路数字信号,本程序没有使用-----------------------
function TForm1.GetDig_inModule_N_States(ModuleNumber:Integer;half_Bank:boolean):DigIn_Result;
var
  DigInResultData:DigIn_Result;
  DighBankstates:Integer;
  DigBankReadData:SIOMM_DigBankReadArea;

begin
  DigInResultData.nResult:= OptoSnapIoMemMapX1.GetDigBankReadAreaEx(DigBankReadData);
  if((half_Bank And((ModuleNumber<8)Or(ModuleNumber>15)))Or((half_Bank=False)And((ModuleNumber<0)Or(ModuleNumber>7)))) then
  // half_Bank==1时指高8位模块,half_Bank==0时指低8位模块
    begin
    DigInResultData.nResult:= User_Error1;
    Result:=DigInResultData ;
    exit;
    end
  else
    begin
    if half_Bank then
      begin
      ModuleNumber:= ModuleNumber-8;
      DighBankstates:= DigBankReadData.nStatePts63to32;
      end
    else DighBankstates:= DigBankReadData.nStatePts31to0;
    case ModuleNumber of
      0: DigInResultData.pDigInMod_N_States:= DighBankstates And $0000000F;
      1: DigInResultData.pDigInMod_N_States:= DighBankstates And $000000F0;
      2: DigInResultData.pDigInMod_N_States:= DighBankstates And $00000F00;
      3: DigInResultData.pDigInMod_N_States:= DighBankstates And $0000F000;
      4: DigInResultData.pDigInMod_N_States:= DighBankstates And $000F0000;
      5: DigInResultData.pDigInMod_N_States:= DighBankstates And $00F00000;
      6: DigInResultData.pDigInMod_N_States:= DighBankstates And $0F000000;
      7: DigInResultData.pDigInMod_N_States:= DighBankstates And $F0000000;
      else DigInResultData.pDigInMod_N_States:= DighBankstates And $0000000F;
      //若无任何分支与表达式的值相匹配,则执行该分支
      end;
     Result:=DigInResultData ;
     exit;
  end;
end;
//------------------------ 将4路DI/O采集到的数转为ASCII码--------------------
function TForm1.GetDig_inModuleStates(ModuleNumber:Integer;half_Bank:boolean;DigInResultData:DigIn_Result):AnsiString;
var
   //phBankstates:array[0..31] of Char;
   pMstr_len:Integer;
   pMstring,InsertString:AnsiString ;
begin
   if ((half_Bank And((ModuleNumber<8)Or(ModuleNumber>15)))Or((half_Bank = False)And((ModuleNumber<0)Or(ModuleNumber>7))))  then
   begin
     Error_Message.Text:= 'Wrong Module Number !';
     pMstring:= 'xxxx';
     result:= pMstring;
     exit;
   end

   else
     begin
     if(half_Bank)  then
     ModuleNumber:= ModuleNumber-8;
     case ModuleNumber of
     0:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,29,4);
         end;
     1:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,25,4);
         end;
     2:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,21,4);
         end;
     3:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,17,4);
         end;
     4:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,13,4);
         end;
     5:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,9,4);
         end;
     6:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,5,4);
         end;
     7:  begin
         pMstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);//将数据转为32BIT的二进制字符串
         pMstr_len:= Length(pMstring);
         InsertString:=StringOfChar('0',32-pMstr_len);
         //创建一个32-pMstr_len长度的全零字符串
         pMstring:=InsertString+pMstring;
         pMstring:= copy(pMstring,1,4);
         end;
      else begin
         Error_Message.Text:= 'Wrong Module Number !';
         pMstring:= 'xxxx';
         end;
      end;
     Result:=pMstring;
     exit;
   end;
end;
//-----------------------第N路模块输出的模拟信号,由内存直接给数---------------------------------
{function TForm1.SetAna_OutModule_N_Value(ModuleNumber:Integer,):AnaOut_Result;
var
   AnaOutData:AnaOut_Result;
begin
   AnaOutData.nResult:= OptoSnapIoMemMapX1.SetAnaPtValue(4*ModuleNumber,AnaOutData.AnaOutModSiData.fValue[0]);
   AnaOutData.nResult:= OptoSnapIoMemMapX1.SetAnaPtValue(4*ModuleNumber+1,AnaOutData.AnaOutModSiData.fValue[0]);
   result:=AnaOutData;
   exit;
end;}
function TForm1.SetAna_OutModule_N_Value(ModuleNumber:Integer;AnaOutModSiData:SIOMM_AnaOutSingleMod):Integer;
var
  nResult:Integer;
begin
  nResult:=OptoSnapIoMemMapX1.SetAnaPtValue(4*ModuleNumber,AnaOutModSiData.fValue[0]);
  nResult:=OptoSnapIoMemMapX1.SetAnaPtValue(4*ModuleNumber+1,AnaOutModSiData.fValue[1]);
  result:=nResult;
  exit;
end;
//------------------------------主运行程序----------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
var
  nResult:Integer;
  AnaInMod012Data:AnaIn_Result;
  //AnaOutModSiData:SIOMM_AnaOutSingleMod;
  HDD32_DigInMod8States:Integer ;
  HDD32_DigInMod8_0States:Integer;
  phBankDstates:array[0..31] of Char;
  ScratchBitHi,ScratchBitLow:Integer;
  ScratchIntBlock:SIOMM_ScratchPadIntegerBlock;
  DigInResultData:DigIn_Result;
  Mstr_len:Integer;
  Mstring,InsertString:Ansistring;
begin

  //// Get the AnalogIn_Module 0,1,2 data
  AnaInMod012Data:= Form1.GetAna_inModule012Value();
  //显示0,1,2 MODULE 的模拟输入值
  //AValue = AnaInMod012Data.fValue[0];
  AnaModule0_1.Text:= Formatfloat('0.00',AnaInMod012Data.pAnaInMod012Data.fValue[0]);
  AnaModule0_2.Text:= Formatfloat('0.00',AnaInMod012Data.pAnaInMod012Data.fValue[1]);
  HandleError(AnaInMod012Data.nResult);

  //AnaOutModSiData.fValue[0]:=15;
  //AnaOutModSiData.fValue[1]:=30;
  //nResult:=SetAna_OutModule_N_Value(6,AnaOutModSiData);
  //从内存往AO里写数

  //从4路DI/O里读写数
  DigInResultData:= Form1.GetDig_inModule_N_States(4,False);
   //显示 MODULE 4 的数字输入
  Mstring:=IntToBinaryStr(DigInResultData.pDigInMod_N_States);
  Mstr_len:= Length(Mstring);
  InsertString:= StringOfChar('0',32-Mstr_len);
  Mstring:=InsertString+Mstring;
  Mstring:= copy(Mstring,13,4);
  DigModule4.Text:= Mstring;

  //从32位高速DI/O读数,该模块装在第8通道
  nResult:= Form1.OptoSnapIoMemMapX1.ReadLong($F1808204,HDD32_DigInMod8States);
  //每一位占8个地址,只有后4位有数据前4位为0,因此用ReadLong就可以读出
  HDD32_DigInMod8_States.Text:= '$'+IntToHex(HDD32_DigInMod8States,8);

  //从32位高速DI/O读第0位数
  HDD32_DigInMod8_0States:= HDD32_DigInMod8States And $00000001;
  //HDD32_DigInMod8_0_State.Text:=IntToBin(HDD32_DigInMod8_0States);
  HDD32_DigInMod8_0_State.Text:=copy(IntToBin(HDD32_DigInMod8_0States),29,31);

  nResult:= Form1.OptoSnapIoMemMapX1.GetScratchPadBitArea(ScratchBitHi,ScratchBitLow);//this is all of the bit variants in the ScratchPad.
  ScratchbitRead.Text:= '$'+IntToHex(ScratchBitHi,8)+IntToHex(ScratchBitLow,8);    //Display

  //读取第五个INT变量
  nResult:= Form1.OptoSnapIoMemMapX1.GetScratchPadIntegerArea(0,ScratchIntBlock);// get a integer 256 matrix once
  ScratchRead_intN.Text:= IntToStr(ScratchIntBlock.nValue[4]);
  if nResult<>SIOMM_OK then
    Form1.HandleError(nResult);

  //单点向4路DO写入,假设为四号模块,第一通道
  Form1.OptoSnapIoMemMapX1.SetDigPtState(12,1);
  // 整体向4路DO写入高位,4号模块第一通道置高
  Form1.OptoSnapIoMemMapX1.SetDigBankOnMask($00000000,$00010000);
  // 整体向4路DO写入高位,4号模块第三通道置低
  Form1.OptoSnapIoMemMapX1.SetDigBankOffMask($00000000,$00040000);
   
end;
//-------------------------第6通道AO模块输出第一路--------------------------------------
procedure TForm1.AnaModule6_1_setClick(Sender: TObject);
var
  nResult:Integer;
  AnaOutModSiData:SIOMM_AnaOutSingleMod;
begin
  if AnaModule6_1.Text='' then
  begin
  Application.MessageBox('输出量不能为空!','Warning !',MB_OK);
  exit;
  end
  else
  nResult:= Form1.OptoSnapIoMemMapX1.SetAnaPtValue(6*4,StrToFloat(AnaModule6_1.Text));
  if (nResult<>SIOMM_OK) then
  Form1.HandleError(nResult);
end;
//--------------------------第6通道AO模块输出第二路------------------------------------
procedure TForm1.AnaModule6_2_setClick(Sender: TObject);
var
  nResult:Integer;
  AnaOutModSiData:SIOMM_AnaOutSingleMod;
begin
  if AnaModule6_2.Text='' then
  begin
  Application.MessageBox('输出量不能为空!','Warning !',MB_OK);
  exit;
  end
  else
  nResult:= Form1.OptoSnapIoMemMapX1.SetAnaPtValue(6*4+1,StrToFloat(AnaModule6_2.Text));
  if (nResult<>SIOMM_OK) then
  Form1.HandleError(nResult);
end;
//---------------------------第五位置高------------------------------------
procedure TForm1.ScratchWrite_bitN_setClick(Sender: TObject);
var
  nResult:Integer;
begin
  nResult:= Form1.OptoSnapIoMemMapX1.SetScratchPadBitAreaMask($00000000,$00000020,$00000000,$00000000);
  //SetScratchPadBitAreaMask前两个参数为置高,后两个参数为清零,写哪位即对哪位操作
  if nResult<>SIOMM_OK then
  Form1.HandleError(nResult);
end;
//---------------------------第五位置低------------------------------------
procedure TForm1.CcratchWrite_bitN_clearClick(Sender: TObject);
var
  nResult:Integer;
begin
  nResult:= Form1.OptoSnapIoMemMapX1.SetScratchPadBitAreaMask($00000000,$00000000,$00000000,$00000020);
  if nResult<>SIOMM_OK then
  Form1.HandleError(nResult);
end;
//---------------------------显示全64位------------------------------------

procedure TForm1.ScratchbitWrite_setClick(Sender: TObject);
var
  nResult:Integer;
  tlength:Integer;
  Bits63to32, Bits31to0:Integer;
  InsertString:AnsiString;
begin
   tlength:= Length(ScratchbitWrite.Text);
   if tlength<16 then
   begin
   InsertString:= StringOfChar('0',16-tlength);
   ScratchbitWrite.Text:=InsertString+ ScratchbitWrite.Text;
   end;
   Bits63to32:= StrToInt('$'+copy(ScratchbitWrite.Text,1,8));
   Bits31to0:= StrToInt('$'+copy(ScratchbitWrite.Text,9,16)); //获取64位的位变量值
   nResult:= Form1.OptoSnapIoMemMapX1.SetScratchPadBitArea(Bits63to32,Bits31to0);
   if nResult<>SIOMM_OK then
   Form1.HandleError(nResult);
end;
//-----------------------写第五个INT-------------------------------------------
procedure TForm1.ScratchWrite_IntN_setClick(Sender: TObject);
var
   nResult:Integer;
   ScratchIntWBlock:SIOMM_ScratchPadIntegerBlock;
begin
   ScratchIntWBlock.nValue[0]:=0;
   ScratchIntWBlock.nValue[1]:=0;
   ScratchIntWBlock.nValue[2]:=0;
   ScratchIntWBlock.nValue[3]:=0;
   // 保护措施
   ScratchIntWBlock.nValue[4]:= StrToInt(ScratchWrite_IntN.Text);
   nResult:= Form1.OptoSnapIoMemMapX1.SetScratchPadIntegerArea(0,5,ScratchIntWBlock);
   if nResult<>SIOMM_OK then
   Form1.HandleError(nResult);
end;
//-------------------------------------------------------------------

procedure TForm1.ScratchWrite_CNStr_setClick(Sender: TObject);
var
  nResult,tlength:Integer;
  ScratchStrBlock:SIOMM_ScratchPadStringBlock;
begin
  if Str1.Text='' then
  begin
    Application.MessageBox('字符串不能为空!','Warning !',MB_OK);
    exit;
  end;
  tlength:=length(Str1.Text);
  //ScratchStrBlock.String_[0].bstrString:= Widestring(Str1.Text+StringOfChar(' ',tlength));
  //***为了存入汉字,在字符后添加等长的空格,在ioControl中就可得到相应全部汉字,否则得到的将为一半的字符数。原因尚不明。
  ScratchStrBlock.String_[0].bstrString:= Widestring(Str1.Text);
  //ScratchStrBlock.String_[0].bstrString:= Str1.Text;
  nResult:= Form1.OptoSnapIoMemMapX1.SetScratchPadStringArea(0,1,ScratchStrBlock);//此处为从第0个位置开始存放1个
  if nResult<>SIOMM_OK then
  Form1.HandleError(nResult);
end;
//未调通,报错
//-------------------------------------------------------------------
function TForm1.IntToBinaryStr(TheVal: Integer): Ansistring;

var

  counter: LongInt;

begin

{This part is here because we remove leading zeros.  That

means that a zero value would return an empty string.}


  if TheVal = 0 then begin

    result := '0';

    exit;

  end;


  result := '';

  counter := $80000000;


  {Suppress leading zeros}

  while  ((counter and TheVal) = 0) do begin

    counter := counter shr 1;

    if (counter = 0) then break; {We found our first "1".}

  end;


  while counter > 0 do begin

    if (counter and TheVal) = 0 then result := result + '0'

    else  result := result + '1';

    counter := counter shr 1;

  end;

end;
//--------------------------------------------------------


end.





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -