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

📄 xndgnb.pas

📁 完成虚拟的多功能电能表
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  TMPBH:=data_reset(mid(dta,3,12));
  if (tmpbh='999999999999') or (tmpbh='AAAAAAAAAAAA') then
    tmpbw:=Combtxbw.ItemIndex
  else
  for i:=1 to GLGBS do
  if TMPBH=GLBH[i] then
  begin
    tmpbw:=i;
    break;
  end;
  sndstr:='';
  if tmpbw=-1 then exit;
  TMPKZM:=mid(dta,17,2);
  if tmpkzm='01' then //请求读数据
    sndstr:=read_db_sj(tmpbh,dta,tmpbw)
{  else if tmpkzm='02' then //读后续数据
  begin
    TMPSJCD:=mid(dta,19,2);
    TMPSJXBS:=mid(dta,21,4);
  end;
  else if tmpkzm='03' then //重读数据
  begin
    TMPSJCD:=mid(dta,19,2);
    TMPSJXBS:=mid(dta,21,4);
  end;}
  else if tmpkzm='04' then //写数据
    sndstr:=write_db_sj(tmpbh,dta,tmpbw)
  else if tmpkzm='08' then //广播校时
    sndstr:=datetime_set(dta,tmpbw)
  else if tmpkzm='0A' then //写设备地址
    sndstr:=addr_set(dta,tmpbw)
  else if tmpkzm='0C' then //更改通讯速率
    sndstr:=txsl_set(dta,tmpbw)
  else if tmpkzm='0F' then //修改密码
    sndstr:=mm_set(dta,tmpbw)
  else if tmpkzm='10' then //最大需量清零
    sndstr:=xl_clear(dta,tmpbw);
  memo1.Lines.add(sndstr);
  if sndstr<>'' then
    sj_fs_485(mscomm1,sndstr,5);
end;

function TxndgnbForm.xl_clear(dta:string;bw:integer):string;
var
  tmpsjcd,tmpsjx:string;
  i,j,m:integer;
begin
  TMPSJCD:=mid(dta,19,2);
  if TMPSJCD='04' then
  begin
    TMPSJX:=hexdel(mid(dta,21,8));
    if GLXLQX[bw]=mid(tmpsjx,1,2) then
    if GLXLMM[bw]=data_reset(mid(tmpsjx,3,6)) then
    begin
//      for i:=1 to GLGBS do
      for m:=0 to 3 do
      for j:=0 to 4 do
      begin
        db_zdxl[bw,0,m,j]:='0';
        db_zdxl[bw,1,m,j]:='00-00 00:00:00';
        grid3.cells[bw,11]:=db_zdxl[bw,0,m,0]+'kW';
        grid3.cells[bw,12]:=db_zdxl[bw,1,m,0];
      end;
    end;
  end;
  result:='';
end;

function TxndgnbForm.mm_set(dta:string;bw:integer):string;
var
  tmpsjcd,tmpsjx,tmpstr:string;
  sndstr:string;
begin
  sndstr:='';
  TMPSJCD:=mid(dta,19,2);
  if tmpsjcd='08' then
  begin
    TMPSJX:=mid(dta,21,16);
    tmpstr:=hexdel(mid(tmpsjx,1,8));
    tmpstr:=leftstr(tmpstr,2)+data_reset(rightstr(tmpstr,6));
    if tmpstr=(GLBCQX[bw]+GLBCMM[bw]) then
    begin
      tmpstr:=hexdel(mid(tmpsjx,9,2));
      GLBCQX[bw]:=tmpstr;
      grid2.cells[4,bw]:=tmpstr;
      tmpstr:=data_reset(hexdel(mid(tmpsjx,11,6)));
      GLBCMM[bw]:=tmpstr;
      grid2.cells[3,bw]:=tmpstr;
      sndstr:='68'+data_chang(GLBH[bw],false)+'688F04'+GLBCQX[bw]+GLBCMM[bw]
             +hexadd('68'+data_chang(GLBH[bw],false)+'688F04'+GLBCQX[bw]+GLBCMM[bw])+'16';
    end;
  end;
  result:=sndstr;
end;

function TxndgnbForm.txsl_set(dta:string;bw:integer):string;
var
  tmpsjcd,tmpsjxbs:string;
  sndstr:string;
begin
    TMPSJCD:=mid(dta,19,2);
    if tmpsjcd='01' then
    begin
      TMPSJXBS:=hexdel(mid(dta,21,2));
      if tmpsjxbs='02' then mscomm1.Settings:='300,e,8,1';
      if tmpsjxbs='04' then mscomm1.Settings:='600,e,8,1';
      if tmpsjxbs='08' then mscomm1.Settings:='1200,e,8,1';
      if tmpsjxbs='10' then mscomm1.Settings:='2400,e,8,1';
      if tmpsjxbs='20' then mscomm1.Settings:='4800,e,8,1';
      if tmpsjxbs='40' then mscomm1.Settings:='9600,e,8,1';
      sndstr:='68'+GLBH[bw]+'688C01'+data_chang(tmpsjxbs,true)+hexadd('68'+GLBH[bw]+'688C01'+data_chang(tmpsjxbs,true))+'16';
    end else
      sndstr:='68'+GLBH[bw]+'688C01FF'+hexadd('68'+GLBH[bw]+'688C01FF')+'16';
    result:=sndstr;
end;

function TxndgnbForm.addr_set(dta:string;bw:integer):string;
var
  tmpsjx,tmpsjcd:string;
  sndstr:string;
begin
    sndstr:='';
    TMPSJCD:=mid(dta,19,2);
    if tmpsjcd='06' then
    begin
      if bw=0 then exit;
      TMPSJX:=mid(dta,21,12);
      GLBH[bw]:=data_reset(hexdel(tmpsjx));
      Grid2.cells[1,bw]:=data_reset(hexdel(tmpsjx));
      sndstr:='68'+tmpsjx+'688A00'+hexadd('68'+tmpsjx+'688A00')+'16';
    end;
    result:=sndstr;
end;

function TxndgnbForm.datetime_set(dta:string;bw:integer):string;
var
  i:integer;
  tmpsjx:string;
begin
  TMPSJX:=hexdel(mid(dta,21,6));
  if bw=0 then
  begin
    for i:=1 to GLGBS do   //时间
      Grid3.cells[i,2]:=mid(tmpsjx,5,2)+':'+mid(tmpsjx,3,2)+':'+mid(tmpsjx,1,2);
  end else
    Grid3.cells[bw,2]:=mid(tmpsjx,5,2)+':'+mid(tmpsjx,3,2)+':'+mid(tmpsjx,1,2);
  result:='';
end;

function TxndgnbForm.write_db_sj(tmpbh,dta:string;bw:integer):string;
var
  i,j,m:integer;
  fl:string;
  tmpsjxbs,tmpsjcd,tmpsjx:string;
  tmpsj:string;
  sndstr:string;
  tmpstr:string;
begin
    sndstr:='';
    tmpstr:=hexdel(mid(dta,25,8)); //密码 权限
    if tmpstr<>(GLBCQX[bw]+GLBCMM[bw]) then
    begin
      sndstr:='68'+tmpbh+'68C40137'+hexadd('68'+tmpbh+'68C40137')+'16'; //密码错误
    end else begin
      TMPSJXBS:=mid(dta,21,4);// 标识码
      if TMPSJXBS='43F3' then  //日期及周次
      begin
        TMPSJX:=hexdel(mid(dta,33,8));
        tmpstr:='20'+mid(tmpsjx,7,2)+'-'+mid(tmpsjx,5,2)+'-'+mid(tmpsjx,3,2);
        Grid3.cells[bw,1]:=tmpstr;
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if TMPSJXBS='44F3' then  //时间
      begin
        TMPSJX:=hexdel(mid(dta,33,6));
        tmpstr:=mid(tmpsjx,5,2)+':'+mid(tmpsjx,3,2)+':'+mid(tmpsjx,1,2);
        Grid3.cells[bw,2]:=tmpstr;
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if (tmpsjxbs='66F3') or (tmpsjxbs='65F3') then //局编号 厂编号
      begin
        tmpsjx:=data_reset(hexdel(mid(dta,33,12)));
        GLBH[bw]:=tmpsjx;
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if (tmpsjxbs='44F4') then //最大需量周期
      begin
        tmpsjx:=hexdel(mid(dta,33,2));
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if (tmpsjxbs='45F4') then //滑差时间
      begin
        tmpsjx:=hexdel(mid(dta,33,2));
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if tmpsjxbs='43F6' then  //时区总数
      begin
        TMPSJX:=hexdel(mid(dta,33,2));
        db_sqzs:=strtoint(tmpsjx);
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if tmpsjxbs='44F6' then  //时段表数
      begin
        TMPSJX:=hexdel(mid(dta,33,2));
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if tmpsjxbs='45F6' then  //日时段数
      begin
        TMPSJX:=hexdel(mid(dta,33,2));
        db_sds:=strtoint(tmpsjx);
        sqsdb:=VarArrayCreate([0,1,1,db_sds], varOleStr);
        listbox1.Items.Clear;
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
      end
      else if tmpsjxbs='72F6' then  //时段表 块写入
      begin
        tmpsjcd:=mid(dta,19,2);
        m:=strtoint('$'+tmpsjcd)-6;
        TMPSJX:=hexdel(mid(dta,33,m*2));
        m:=m div 3;
        for i:=0 to m-1 do
        begin
          tmpstr:=mid(tmpsjx,1+i*6,2);
          j:=strtoint(tmpstr);
          case j of
          1:
            fl:='尖';
          2:
            fl:='峰';
          3:
            fl:='平';
          4:
            fl:='谷';
          else
            fl:='';
          end;
          tmpstr:=mid(tmpsjx,5+i*6,2)+':'+mid(tmpsjx,3+i*6,2);
          listbox1.Items.Add('------费率:'+fl+'------'+tmpstr);
          if fl<>'' then
            sqsdb[0,i+1]:=fl;
          sqsdb[1,i+1]:=tmpstr+':00';
        end;
        sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
        ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName)+'sqsd_set.dat');
      end
      else
      for i:=1 to db_sqzs do
      begin
        if tmpsjxbs=inttohex($53+i,2)+'F6' then
        begin
          tmpsjx:=hexdel(mid(dta,33,6));
          tmpstr:='第'+inttostr(i)+'时区---起始日期:'+mid(tmpsjx,5,2)+'月'+mid(tmpsjx,3,2)+'日';
          listbox1.Items.Insert((i-1)*(db_sds+1),tmpstr);
          sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
        end else
        for m:=1 to db_sds do
        begin
          tmpstr:=inttohex($53+m+i*$10,2)+'F6';
          if tmpsjxbs=tmpstr then
          begin
            TMPSJX:=hexdel(mid(dta,33,6));
            tmpsj:=mid(tmpsjx,1,2);
            j:=strtoint(tmpsj);
            case j of
            1:
              fl:='尖';
            2:
              fl:='峰';
            3:
              fl:='平';
            4:
              fl:='谷';
            else
              fl:='';
            end;
            tmpsj:=mid(tmpsjx,5,2)+':'+mid(tmpsjx,3,2);
            listbox1.Items.Add('------费率:'+fl+'------'+tmpsj);
            if fl<>'' then
              sqsdb[0,i+1]:=fl;
            sqsdb[1,i+1]:=tmpsj+':00';
            sndstr:='68'+data_chang(tmpbh,false)+'688400'+hexadd('68'+data_chang(tmpbh,false)+'688400')+'16';
          end;
        end;
        ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName)+'sqsd_set.dat');
      end;
    end;
    result:=sndstr;
end;


function TxndgnbForm.read_db_sj(tmpbh,dta:string;bw:integer):string;
var
  i,fl,num:integer;
  tmpsj:string;
  tmpsjcd,tmpsjxbs,tmpsjx:string;
  sndstr:string;
begin

⌨️ 快捷键说明

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