求助 TPSScript 脚本 不按顺序执行PASCAL脚本

2019-12-10 18:21发布

使用delphi7 + TPSScript 脚本控件 来执行PSACAL脚本, 速度很快,效率非常高,比LUA好,但是后面发现脚本执行效果不对,查了好久才发现脚本不是按顺序执行的,某些脚本代码提前执行了,

脚本如下:

function ChannelReadSensorID(Channel: Byte): Boolean;
var
    devAddr: Byte;
    i, n: Integer;
    ID: Cardinal;
begin
    Result := False;
    if (Channel < 0) or (not (Channel < ChannelCount)) then exit;
   
    n :=0;
    for devAddr:=minDeviceAddr to maxDeviceAddr do
    begin
        if not CheckChannelExist(devAddr, Channel) then Continue;

        CAN_SendShortCMD(devAddr, Channel, CAN_CMD_SelectChannel , Channel);
        SetSensorID(devAddr, Channel, 0);
        CAN_DelayMS(devAddr, Channel, 200); // 继电器切换,等待200ms时间
        CAN_SendShortCMD(devAddr, Channel, CAN_CMD_ForceRestToOWIMode , 0);
        CAN_DelayMS(devAddr, Channel, 300);
        RegistersClearRegsStatus(devAddr, Channel);
        RegistersSetReadStatus(devAddr, Channel, NSA_REG_OFFSET_ID, 4);
        RegistersTxReadCmdByStatus(devAddr, Channel);
        Inc(n);
    end;
    if n > 0 then DelayMs(500);
   
// wait when all ok, or Timeout
    for i:= 0 to 5 do
    begin
        DelayMs(100);
        
        n := 0;
        for devAddr:=minDeviceAddr to maxDeviceAddr do
        begin
            if CheckChannelExist(devAddr, Channel) and RegistersReadErrCheck(devAddr, Channel) then Inc(n);
        end;
        if n = 0 then break;
    end;
   
   
// if read error, Read cmd again, and wait a moment
    n :=0;
    for devAddr:=minDeviceAddr to maxDeviceAddr do
    begin
        if CheckChannelExist(devAddr, Channel) and RegistersReadErrCheck(devAddr, Channel) then
        begin
            RegistersReadAgainIfError(devAddr, Channel);
            inc(n);
        end;
    end;
    if n > 0 then DelayMs(500);

//----------------------以下的代码提前执行了-----------------------------------------
    for devAddr:=minDeviceAddr to maxDeviceAddr do
    begin
        if CheckChannelExist(devAddr, Channel) and (not RegistersReadErrCheck(devAddr, Channel)) then
        begin
            ID := SensorID(devAddr, Channel);
            if (not CheckSensorID(ID)) then
            begin
                ID := NewSensorID();
                SetSensorID(devAddr, Channel, ID);
            end
            else begin
                 GetHistoryDataByID(devAddr, Channel, ID);
            end;
        end;
    end;
   

    Result := True;
end;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
aleyn
1楼-- · 2019-12-10 19:20
试试 RemObjects 的 Pascal Script,或是 IPS3, 或是FastReport 的 Pascal Script。
knight_avr
2楼-- · 2019-12-11 01:02
aleyn 发表于 2019-8-3 10:14
试试 RemObjects 的 Pascal Script,或是 IPS3, 或是FastReport 的 Pascal Script。

TPSScript 就是 RemObjects里面的pascal script 控件
knight_avr
3楼-- · 2019-12-11 05:53
现在可以基本肯定 是 DelayMs(ms) 这个函数,脚本调用后,不等待执行完毕,就马上执行下一条脚本。 DelayMs 这个是外部导入的,

现在 把DelayMs(ms) 函数 在脚本里实现, 解决问题了

一周热门 更多>