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

📄 scom.pas

📁 西门子与计算机通讯程序包括源代码 程序说明 控件 及控件使用手册 使用西门子prodave 控件 这是第一版
💻 PAS
字号:
unit scom;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  StdCtrls,Prodave, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    PageControl1: TPageControl;
    TabSheet2: TTabSheet;
    Label10: TLabel;
    Label11: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Memo1: TMemo;
    Button3: TButton;
    TabSheet3: TTabSheet;
    Button6: TButton;
    Panel7: TPanel;
    RadioGroup1: TRadioGroup;
    Edit7: TEdit;
    Button4: TButton;
    RadioGroup2: TRadioGroup;
    Button5: TButton;
    Button7: TButton;
    Memo2: TMemo;
    Label9: TLabel;
    Label13: TLabel;
    Edit10: TEdit;
    Edit11: TEdit;
    CheckBox1: TCheckBox;
    Label12: TLabel;
    Label16: TLabel;
    Label14: TLabel;
    Label17: TLabel;
    CheckBox2: TCheckBox;
    Button8: TButton;
    CheckBox3: TCheckBox;
    Splitter1: TSplitter;
    Panel8: TPanel;
    Panel9: TPanel;
    Panel10: TPanel;
    Panel11: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Memo1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

    procedure RadioGroup1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
   
    
  private
    { Private declarations }
  public  
    { Public declarations }

  end;
const
ScreenHeight:integer=1024;
ScreenWidth:integer=768;
var
  Form1: TForm1;
  plc_adr_table : array [0..15] of byte;
  res: longint;
  linkname:array[0..255] of char;
  ErrMess:array[0..255] of char;
  adr_table: adr_table_type  ;
  linkstatus:boolean;
  data1:array[0..255] of byte;

implementation

uses datalog,  Unit4;






{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 begin
 adr_table.adr := strtoint(edit1.Text); {address}
 adr_table.segmentid := strtoint(edit2.Text); {segment id}
 adr_table.slotno := strtoint(edit3.Text); {slot no}
 adr_table.rackno := strtoint(edit4.Text); {rack no}
 adr_table.end0:=0;

strcopy(linkname,'S7ONLINE');
res := Load_tool(1,addr(linkname),addr(adr_table));
label1.Caption:=format('errormessagecode=%.4x',[res]);
if(Prodave.Error_Message(res, ErrMess)=0)
  then if res<>0
         then
           begin
            label2.Caption:=ErrMess ;
            statusbar1.Panels[0].Text:='连接错误';
           end
          else
           begin
            label2.Caption:='ok'    ;
            linkstatus:=true;
            statusbar1.Panels[0].Text:='已连接';
           end
  else
   label2.Caption:='error.data error';
end;



procedure TForm1.Button2Click(Sender: TObject);
var
i:integer ;
begin
res := Unload_Tool;
label1.Caption:=format('errormessagecode=%.4x',[res]);
i:=Prodave.Error_Message(res, ErrMess);
if(i=0)
  then if res<>0
         then
          label2.Caption:=ErrMess +inttostr(res)
          else
          begin
          label2.Caption:='ok' ;
           statusbar1.Panels[0].Text:='连接关闭';
            linkstatus:=false;
          end
  else
  begin
   label2.Caption:='error.data error'+inttostr(i);
   statusbar1.Panels[0].Text:='关闭error';
   end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
   tt:string;
   aa,sss:integer;


begin
sss:=0;
SetLength (tt, 100);

if  linkstatus=false then
 begin
   MessageBox(Handle, '通讯未打开', '错误', MB_OK + MB_ICONINFORMATION + MB_TOPMOST) ;
   exit;
  end;
if ((radiogroup1.ItemIndex <0) or (radiogroup1.ItemIndex> 5))then
  begin
  messagebox(null,'error','未选择内存类型',MB_OK	) ;
  exit;
  end  ;
if ((radiogroup2.ItemIndex <0 )or (radiogroup2.ItemIndex> 3))then
   begin
    messagebox(null,'error','未选择工作模式',MB_OK	) ;
    exit;
   end;

//数据读取
case radiogroup1.ItemIndex of
  0:// 输入
  begin
    tt:='输入 byte' ;
    res:=e_Field_Read(strtoint(edit6.Text), strtoint(edit5.Text), data1) ;
  end ;
  1: //输出
    begin
     tt:='输出  byte ';
     res:=a_Field_Read(strtoint(edit6.Text), strtoint(edit5.Text), data1) ;
    end;
  2:   //M区
   begin
    tt:='M区  byte';
    res:=m_Field_Read(strtoint(edit6.Text), strtoint(edit5.Text), data1) ;
   end ;
  3: //  DB块
  begin
    aa:= strtoint(edit5.Text) ;

    tt:='DB块 word' ;
    res:=db_Read(strtoint(edit7.Text),strtoint(edit6.Text), aa,data1) ;
  end;
  4:  //定时器
  begin
  aa:= strtoint(edit5.Text) ;
     tt:='定时器 word';
     res:=t_Field_Read(strtoint(edit6.Text), aa, data1) ;
  end;
  5: //计数器
  begin
    tt:='计数器 word';
    res:=z_Field_Read(strtoint(edit6.Text), strtoint(edit5.Text), data1) ;
  end;
else
  messagebox(null,'error','错误代号一',MB_OK	) ;
end;


//报警显示
if res<>0 then
     begin
       label1.Caption:=format('errormessagecode=%.4x',[res]);
       Prodave.Error_Message(res, ErrMess);
       label2.Caption:=ErrMess;
     end ;

//内容显示  ;
case radiogroup2.ItemIndex of
  0://    十进制
     begin
  memo1.Text:=memo1.Text+'十进制显示'+tt+#13#10;

  if  checkbox1.Checked=false then
      while( (sss< strtoint(edit5.Text))and (sss < 200) ) do
          begin
         //   hextobin(format('%.2d',[data1[sss]]), binstr,4);
            memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss)+'..'+ format('%.2d',[data1[sss]])+#13#10;
            sss:=sss+1;
          end
    else
     while( (sss< strtoint(edit5.Text)*2)and (sss < 100) ) do
          begin
               memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss div 2)+'..'+ format('%.2d',[data1[sss]]);
               sss:=sss+1;
               memo1.Text:= memo1.Text+format('%.2d',[data1[sss]])+#13#10;
               sss:=sss+1;
          end ;

    if checkbox3.Checked=true then
      SendMessage(Memo1.Handle,EM_SCROLL,SB_BOTTOM,0);
   end;
  1: //  十六进制
     begin

      memo1.Text:=memo1.Text+'十六进制显示 '+tt+#13#10;
      if  checkbox1.Checked=false then
        while( (sss< (strtoint(edit5.Text)))  and (sss < 200) ) do
            begin
                memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss)+'..'+ format('%.2x',[data1[sss]])+#13#10;
              sss:=sss+1;
            end
      else
         while( (sss< strtoint(edit5.Text)*2)and (sss < 100) ) do
            begin
             //   memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss)+'..'+ format('%4x',[(pinteger(@data1[sss*2]))^])+#13#10;
               memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss div 2)+'..'+ format('%.2x',[data1[sss]]);
               sss:=sss+1;
               memo1.Text:= memo1.Text+format('%.2x',[data1[sss]])+#13#10;
               sss:=sss+1;
            end;
    if checkbox3.Checked=true then
      SendMessage(Memo1.Handle,EM_SCROLL,SB_BOTTOM,0);
  end;
  2:// 二进制
  
    begin

      memo1.Text:=memo1.Text+'二进制显示 '+tt+#13#10;
      if  checkbox1.Checked=false then
        while( (sss< (strtoint(edit5.Text)))  and (sss < 200) ) do
            begin
                memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss)+'..'+ format('%.2x',[data1[sss]])+#13#10;
                sss:=sss+1;
            end
      else
         while( (sss< strtoint(edit5.Text)*2)and (sss < 100) ) do
            begin
            
               memo1.Text:=memo1.Text+inttostr(strtoint(edit6.Text)+sss div 2)+'..'+ format('%.2x',[data1[sss]]);
               sss:=sss+1;
               memo1.Text:= memo1.Text+format('%.2x',[data1[sss]])+#13#10;
               sss:=sss+1;
            end;
    if checkbox3.Checked=true then
      SendMessage(Memo1.Handle,EM_SCROLL,SB_BOTTOM,0);
  end;
  else
  messagebox(null,'error','错误代号二',MB_OK	) ;
end;




end;

procedure TForm1.FormCreate(Sender: TObject);
var
 x,y:longint;

begin
linkstatus:=false;
 form1.Scaled:=true;
 x:= GetSystemMetrics(SM_CXSCREEN);
 Y:= GetSystemMetrics(SM_CYSCREEN);
 if (x<>ScreenHeight)or (y<>ScreenWidth) then
 begin
  form1.Height:=form1.Height*x div ScreenHeight;
  form1.Height:=form1.Width*y div ScreenWidth;
  scaleby(x,screenHeight);
 end;




end;

procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Clear;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
   memo2.Clear;
end;





procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
LineNum,LineLength:longint;
CharsBeforeLine,LineLength1:longint;
begin
LineNum := SendMessage(Memo1.Handle,EM_LINEFROMCHAR, Memo1.SelStart,0);
LineLength1:=memo1.Lines.Count;
CharsBeforeLine:=SendMessage(Memo1.Handle,EM_LINEINDEX,LineNum,0);
LineLength:=SendMessage(Memo1.handle,EM_LINELENGTH,CharsBeforeLine,0);
Label12.Caption:='Line:       '+Format('%.4d', [LineNum + 1])+Format('--%.4d', [LineLength1 + 1]); //'x= 12' //指定宽度IntToStr(LineNum + 1);
Label16.Caption:='Position: '+Format('%.4d', [(Memo1.SelStart -  CharsBeforeLine)+1])+Format('--%.4d', [LineLength + 1]); //IntToStr((Memo1.SelStart -  CharsBeforeLine)+1);
end;

procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
LineNum,LineLength:longint;
CharsBeforeLine,LineLength1:longint;
begin
LineNum := SendMessage(Memo1.Handle,EM_LINEFROMCHAR, Memo1.SelStart,0);
LineLength1:=memo1.Lines.Count;
CharsBeforeLine:=SendMessage(Memo1.Handle,EM_LINEINDEX,LineNum,0);
LineLength:=SendMessage(Memo1.handle,EM_LINELENGTH,CharsBeforeLine,0);
Label12.Caption:='Line:       '+Format('%.4d', [LineNum + 1])+Format('--%.4d', [LineLength1 + 1]); //'x= 12' //指定宽度IntToStr(LineNum + 1);
Label16.Caption:='Position: '+Format('%.4d', [(Memo1.SelStart -  CharsBeforeLine)+1])+Format('--%.4d', [LineLength + 1]); //IntToStr((Memo1.SelStart -  CharsBeforeLine)+1);
end;


procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if( radiogroup1.ItemIndex>2) and (radiogroup1.ItemIndex<6)  then
  checkbox1.Checked:=true else   checkbox1.Checked:=false;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
//if  linkstatus=false  then Application.MessageBox('请设置通讯参数再次连接后重试',  '错误未通讯',   MB_OK +
//  MB_ICONINFORMATION
//  + 
//  MB_TOPMOST)
//   else
 form2.Show;
 Form1.Visible:=False;
end;




end.

⌨️ 快捷键说明

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