河南电力公司月薪4000面试试题(要知道河南月薪4000是什么概念)
代码很长 下面是部分代码(未全)如果有人能解决请与我联系 QQ:251052979
数据发送的正确格式为 FB 02 C0 D4 01 00……………………………..FF
现在发送的为错误格式 FB 02 00 01 D4 40.......................00
TErrRec = record
MtNo:TMtNo; //序号
Rnd: Integer; //圈数
Tim: Integer; //计算圈数使用的时间 Second
CalVal:Double;//算定值
ErrPort: TSamplePort;//New
end;
TErrParams = record
ErrArs:array[TMtNo] of TErrRec;
cPts: DWord;
function TDevComm.SetErrParaEx(Sn, RationOrTime: Integer;
ErrorType: TErrorType): Integer;
var
EP: TErrParams;
i: Integer;
begin
EP.cPts := 12;
EP.ErrArs[0].ErrPort := FSamplePort;
EP.ErrArs[0].MtNo := 1;
if ErrorType = etRatation then
begin
EP.ErrArs[0].Rnd := RationOrTime;
EP.ErrArs[0].Tim := 1;
end
else begin
//EP.ErrArs[0].Rnd := TestMeter.CalcRatation(Sn, RationOrTime);
EP.ErrArs[0].Rnd := RationOrTime;
EP.ErrArs[0].Tim := RationOrTime;
end;
//EP.ErrArs[0].CalVal := Trunc(EP.ErrArs[0].Rnd * 3600 / 200 * 1000 * 10000/ (TestMeter.GetCs(Sn) * FIRange)); //算定值的计算方法待定
//电能误差计算参数设定
for i := 0 to 11 do //有12块电表
EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+1)) / FIRange; //按200V
WriteDevCmd(dtSetErrParm, @EP); //每一块电表的值
{ for i := 0 to 11 do
EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+13)) / FIRange; //按200V
WriteDevCmd(dtSetErrParm2, @EP); }
//WriteDevCmd(dtSetErrParm, @FF);
Result := EP.ErrArs[0].Rnd; //返回实际设定的试验圈数
end;{************************************************************}
{过程名 :WriteDevCmd }
{功能描述:数据设置命令解释并写入设备 }
{全局变量:无 }
{调用模块:本单元 }
{作 者 :李淼 }
{日期 : }
{************************************************************}
function WriteDevCmd(DataType: TDataType; lpBuffer: Pointer): Integer;
var
Cmd: WideString;
begin
Result := E_NOIMPL;
if (DataType in ErrCmdSets) and Assigned(SetDevCmdErr) then
begin
Result := SetDevCmdErr(DataType, 0, lpBuffer, Cmd);
//ShowMessage(inttostr(Result));
if Result = E_OK then WriteDevComm(DataType, Cmd);
ShowMessage(inttostr(Result));
//ShowMessage(Cmd);
end
else if (DataType in ErrCmdSets2) and Assigned(SetDevCmdErr2) then
begin
Result := SetDevCmdErr2(DataType, 0, lpBuffer, Cmd);
if Result = E_OK then WriteDevComm(DataType, Cmd);
end
else if Assigned(SetDevCmd) then begin
Result := SetDevCmd(DataType, 0, lpBuffer, Cmd);
if Result = E_OK then WriteDevComm(DataType, Cmd);
end
else LastWarnString := RSComm104;//规约解释文件加载错误
end;
{************************************************************}
{过程名 :WriteDevComm }
{功能描述:根据数据请求类别向对应设备写入命令行 }
{全局变量:无 }
{调用模块:本单元 }
{作 者 :李淼 }
{日期 :2005.07 }
{************************************************************}
procedure WriteDevComm(DataType: TDataType; Cmd: WideString);
var
PortNo: Integer;
begin
if DataType in ErrCmdSets then
PortNo := ErrCalc.Port
else if DataType in ErrCmdSets2 then
PortNo := ErrCalc2.Port
else PortNo := Power.Port; //写入主控端口
//数据写入端口
WriteInto(PortNo, Cmd);
ShowMessage(Cmd);
end;
{************************************************************}
{过程名 :WriteInto }
{功能描述:1、向通讯端口写入数据 }
{ 2、通讯写入数据导入监控窗口 }
{全局变量:无 }
{调用模块:STComm_IMP }
{作 者 :李淼 }
{日期 :2005.07 }
{************************************************************}
procedure WriteInto(PortNum: Integer; const CmdStr: WideString);
const
Comma = ',';
var
SubCmd: WideString;
nPos, nPos2: Integer;
nLen: Integer;
begin
nLen := Length(CmdStr);
nPos := 1;
nPos2 := 1;
while nPos2 > 0 do
begin
nPos2 := PosEx(Comma, CmdStr, nPos);
if nPos2 = 0 then
SubCmd := Copy(CmdStr, nPos, nLen - nPos + 1)
else begin
SubCmd := Copy(CmdStr, nPos, nPos2 - nPos);
end;
if Length(SubCmd) > 0 then
begin
if PortNum = TestTB.Port then //Timer数据是ASCII
WriteComm(PortNum, ASCToHex(SubCmd))
else WriteComm(PortNum, SubCmd);
//将数据导入监控窗体
if Assigned(SpyFrm) and SpyFrm.Visible then
SpyFrm.ShowData(1, PortNum, SubCmd);
end;
nPos := nPos2 + 1;
if nPos2 > 0 then
DelayTime(200);
end;
end;function ASCToHex(Str: String): String;
var
Ts,Rs :String; //临时字符串
begin
Ts := Str;
Result := '';
while Length(Ts) > 0 do
begin
Rs := Copy(Ts,1,1);
Result := Result + IntToHex(Ord(Rs[1]),2);
Delete(Ts,1,1);
end;
end;
function SetDevCmd(Fn: TDataType; Param: Integer; DPR: Pointer; out Cmd: WideString): Integer;
var
CmdStr, Ts: string;
I: Integer;
begin
Result := E_OK;
case Fn of//解析参数数据
dtSetErrParm2:
begin
with TErrParams(DPR^) do
begin
Cmd := 'FB' + Format('%.2d', [ErrArs[0].Rnd]);
for I := 0 to cpts - 1 do
Cmd := Cmd + IntToHex(Trunc(ErrArs[i].CalVal), 8);
end;
if Length(Cmd) = 100 then
for i := 0 to 15 do
Cmd := Cmd + '00';
Cmd := Cmd + 'FF';
if Length(Cmd) <> 132 then Cmd := '';
end;
dtSetTestWk2:
begin
with TDevCtrl(DPR^) do
if Op = 1 then Cmd := 'F3' else Cmd := 'F4';
end;
else
Result := E_NOIMPL;
end;
OutPutDebugString(Pchar(Cmd));
end;function GetDevCmd(Fn: TDataType; Param: integer; out Cmd: WideString): Integer;
begin
Result := E_OK;
case Fn of
dtGetPulses2:
Cmd := 'FD';
dtGetErrs2:
Cmd := 'FE';
else
Result := E_NOIMPL;
end;
end;end.
代码很长 下面是部分代码(未全)如果有人能解决请与我联系 QQ:251052979
数据发送的正确格式为 FB 02 C0 D4 01 00……………………………..FF
现在发送的为错误格式 FB 02 00 01 D4 40.......................00
TErrRec = record
MtNo:TMtNo; //序号
Rnd: Integer; //圈数
Tim: Integer; //计算圈数使用的时间 Second
CalVal:Double;//算定值
ErrPort: TSamplePort;//New
end;
TErrParams = record
ErrArs:array[TMtNo] of TErrRec;
cPts: DWord;
function TDevComm.SetErrParaEx(Sn, RationOrTime: Integer;
ErrorType: TErrorType): Integer;
var
EP: TErrParams;
i: Integer;
begin
EP.cPts := 12;
EP.ErrArs[0].ErrPort := FSamplePort;
EP.ErrArs[0].MtNo := 1;
if ErrorType = etRatation then
begin
EP.ErrArs[0].Rnd := RationOrTime;
EP.ErrArs[0].Tim := 1;
end
else begin
//EP.ErrArs[0].Rnd := TestMeter.CalcRatation(Sn, RationOrTime);
EP.ErrArs[0].Rnd := RationOrTime;
EP.ErrArs[0].Tim := RationOrTime;
end;
//EP.ErrArs[0].CalVal := Trunc(EP.ErrArs[0].Rnd * 3600 / 200 * 1000 * 10000/ (TestMeter.GetCs(Sn) * FIRange)); //算定值的计算方法待定
//电能误差计算参数设定
for i := 0 to 11 do //有12块电表
EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+1)) / FIRange; //按200V
WriteDevCmd(dtSetErrParm, @EP); //每一块电表的值
{ for i := 0 to 11 do
EP.ErrArs[i].CalVal := (180000000 * EP.ErrArs[0].Rnd / TestMeter.GetCs(i+13)) / FIRange; //按200V
WriteDevCmd(dtSetErrParm2, @EP); }
//WriteDevCmd(dtSetErrParm, @FF);
Result := EP.ErrArs[0].Rnd; //返回实际设定的试验圈数
end;{************************************************************}
{过程名 :WriteDevCmd }
{功能描述:数据设置命令解释并写入设备 }
{全局变量:无 }
{调用模块:本单元 }
{作 者 :李淼 }
{日期 : }
{************************************************************}
function WriteDevCmd(DataType: TDataType; lpBuffer: Pointer): Integer;
var
Cmd: WideString;
begin
Result := E_NOIMPL;
if (DataType in ErrCmdSets) and Assigned(SetDevCmdErr) then
begin
Result := SetDevCmdErr(DataType, 0, lpBuffer, Cmd);
//ShowMessage(inttostr(Result));
if Result = E_OK then WriteDevComm(DataType, Cmd);
ShowMessage(inttostr(Result));
//ShowMessage(Cmd);
end
else if (DataType in ErrCmdSets2) and Assigned(SetDevCmdErr2) then
begin
Result := SetDevCmdErr2(DataType, 0, lpBuffer, Cmd);
if Result = E_OK then WriteDevComm(DataType, Cmd);
end
else if Assigned(SetDevCmd) then begin
Result := SetDevCmd(DataType, 0, lpBuffer, Cmd);
if Result = E_OK then WriteDevComm(DataType, Cmd);
end
else LastWarnString := RSComm104;//规约解释文件加载错误
end;
{************************************************************}
{过程名 :WriteDevComm }
{功能描述:根据数据请求类别向对应设备写入命令行 }
{全局变量:无 }
{调用模块:本单元 }
{作 者 :李淼 }
{日期 :2005.07 }
{************************************************************}
procedure WriteDevComm(DataType: TDataType; Cmd: WideString);
var
PortNo: Integer;
begin
if DataType in ErrCmdSets then
PortNo := ErrCalc.Port
else if DataType in ErrCmdSets2 then
PortNo := ErrCalc2.Port
else PortNo := Power.Port; //写入主控端口
//数据写入端口
WriteInto(PortNo, Cmd);
ShowMessage(Cmd);
end;
{************************************************************}
{过程名 :WriteInto }
{功能描述:1、向通讯端口写入数据 }
{ 2、通讯写入数据导入监控窗口 }
{全局变量:无 }
{调用模块:STComm_IMP }
{作 者 :李淼 }
{日期 :2005.07 }
{************************************************************}
procedure WriteInto(PortNum: Integer; const CmdStr: WideString);
const
Comma = ',';
var
SubCmd: WideString;
nPos, nPos2: Integer;
nLen: Integer;
begin
nLen := Length(CmdStr);
nPos := 1;
nPos2 := 1;
while nPos2 > 0 do
begin
nPos2 := PosEx(Comma, CmdStr, nPos);
if nPos2 = 0 then
SubCmd := Copy(CmdStr, nPos, nLen - nPos + 1)
else begin
SubCmd := Copy(CmdStr, nPos, nPos2 - nPos);
end;
if Length(SubCmd) > 0 then
begin
if PortNum = TestTB.Port then //Timer数据是ASCII
WriteComm(PortNum, ASCToHex(SubCmd))
else WriteComm(PortNum, SubCmd);
//将数据导入监控窗体
if Assigned(SpyFrm) and SpyFrm.Visible then
SpyFrm.ShowData(1, PortNum, SubCmd);
end;
nPos := nPos2 + 1;
if nPos2 > 0 then
DelayTime(200);
end;
end;function ASCToHex(Str: String): String;
var
Ts,Rs :String; //临时字符串
begin
Ts := Str;
Result := '';
while Length(Ts) > 0 do
begin
Rs := Copy(Ts,1,1);
Result := Result + IntToHex(Ord(Rs[1]),2);
Delete(Ts,1,1);
end;
end;
function SetDevCmd(Fn: TDataType; Param: Integer; DPR: Pointer; out Cmd: WideString): Integer;
var
CmdStr, Ts: string;
I: Integer;
begin
Result := E_OK;
case Fn of//解析参数数据
dtSetErrParm2:
begin
with TErrParams(DPR^) do
begin
Cmd := 'FB' + Format('%.2d', [ErrArs[0].Rnd]);
for I := 0 to cpts - 1 do
Cmd := Cmd + IntToHex(Trunc(ErrArs[i].CalVal), 8);
end;
if Length(Cmd) = 100 then
for i := 0 to 15 do
Cmd := Cmd + '00';
Cmd := Cmd + 'FF';
if Length(Cmd) <> 132 then Cmd := '';
end;
dtSetTestWk2:
begin
with TDevCtrl(DPR^) do
if Op = 1 then Cmd := 'F3' else Cmd := 'F4';
end;
else
Result := E_NOIMPL;
end;
OutPutDebugString(Pchar(Cmd));
end;function GetDevCmd(Fn: TDataType; Param: integer; out Cmd: WideString): Integer;
begin
Result := E_OK;
case Fn of
dtGetPulses2:
Cmd := 'FD';
dtGetErrs2:
Cmd := 'FE';
else
Result := E_NOIMPL;
end;
end;end.
解决方案 »
- delphi 2010 里的TRibbon 怎么不能放Edit控件啊,不会用,请高手指点!
- memo的几个简单问题
- 有个过分的需求~
- 初学者的烦恼
- 安装ActiveX控件 Windows Media Player 时出现了下面的错误
- 100元200MB空间,全国最便宜的网上家园!
- 请帮忙解答一下在DBGRID里面怎么判断一个字段为空! 在线等线!马上结贴!
- 请问大家,如何锁住键盘和鼠标,可有相关的函数?
- 送分:各位兄台,小弟要去上学了,不知以后还能不能来,就把我的2121分全送了。。。。..
- 我是一个新手,刚刚学习delphi,希望能得到各位大虾的帮助,如何去学习这门语言.感兴趣的请跟贴
- 要些一个在win98下的socket服务程序,大家推荐一下用啥控件?Indy?
- delphi编写的bho,运行结果正确,不过老出现异常,请各位指点!
这个应该是通过串口跟下位机通信吧,协议呢?
如果FB是包头,FF是包尾,那么其他对应的是什么内容?不知道怎么协议怎么做
另外数据好像直接发送的,难道数据中间就没有遇到FF这样的数据?如果遇到呢?
难道发送之前不拆分数据包?