Function readFromPLC(ReadChar:Array of char;ReadAddress:Array of Byte;ReadBytes:Integer):Booleam;
Var
ReadDataSum:integer;
DataSumCheck:integer;
tmpStr:String;
tmpchr,chr,chr2:char;
tmpVar:Variant;
Input:Variant;
InputLen,i,tmpInt:Integer;
tmpVar[1]:=$02;//STX 起始標誌
tmpVar[2]:=$30;//CMD0 讀命令
DataSumCheck:=DataSumCheck+$30
DataSumCheck:=0;//和校驗位初始化
tmpVar:=VarArrayCreate([1,11]),
//創建數組,用來存放待發送的命令格式數據流
tmpVar[3]:=ReadAddress[0];
//讀位元件4位起始地址:0~3
DataSumCheck:=DataSumCheck+ReadAddress[0];
tmpVar[4]:=ReadAddress[1];
DataSumCheck:=DataSumCheck+ReadAddress[1];
tmpVar[5]:=ReadAddress[2];
DataSumCheck:=DataSumCheck+ReadAddress[2];
tmpVar[6]:=ReadAddress[3];
DataSumCheck:=DataSumCheck+ReadAddress[3];
tmpStr:=IntToHex(ReadBygtes,2);
//讀位元件個數轉化為2位16進制
tmpChr:=tmpStr[1];//取16進制的低位
tmpVar[7]:=Ord(tmpChr);//轉化為ASCII形式
DataSumCheck:=DataSumCheck+Ord(tmpChr);
mpChr:=tmpStr[2];// 取16進制的高位
tmpVar[8]:=Ord(tmpChr);//轉化為ASCII形式
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpVar[9]:=$03;//ETX 停止位標誌
DataSumCheck:= DataSumCheck+$03;
tmpStr:=IntToHex(DataSumCheck,2);
//和校驗位轉化為2位16進制
tmpChr:=tmpStr[1];
tmpVar[10]:=Ord(tmpStr);
tmpChr:=tmpStr[2];
tmpVar[11]:=Ord(tmpStr);
MainForm.MSComm.Outupt:=tmpVar;
//向發送緩沖區寫數據流
Sleep(1000);//延時
InputLen:=MaiForm.MSComm.InBufferCount;
//返回輸入緩沖區內的等待讀取的字節個數
Input:=MaiForm.MSComm.Input;
//讀取接收緩沖區中的數據
If InputLen>0 then//待讀取的字節個數大於0
Begin
If Input[0]=$02 then//STX返回數據的起始誌
Begin //讀取返回數據
ReadDataSum:=0;//返回值求和初始化
For i:=1 to ReadBytes do
Begin
tmpInt:=Input[i];
ReadChar[i-1]:=chr(tmpInt);
//將返回的ASCⅡ值轉換為字符型
ReadDataSum:=ReadDataSum+Input[1];
End;
Inc(i);
If Input[i]=$03 then //ETX,停止位標誌
Begin
ReadDataSum:= ReadDataSum+$03;
tmpStr:=InttoHex(ReadDataSum,2);
chr1:=tmpStr[1];//求校驗位
chr2:=tmpStr[2];
if (Ord(chr1)=Input[i+1]) and
(Ord(ch2)=Input[i+2]) then//校驗成功
Begin //數據取成功
Result:=True;
ShowMessage(‘DataRead succeed’);
end
else begin //校驗錯
Result:=False;
ShowMessage(‘DataRead Check fail’);
end;
end; //ETX
end //STX
else // If Input[0]<>$02
Result:=False;
end
else // If InputLen=0
Result:=False;
End;