📄 cup_connection.pas
字号:
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 + -