delphi 7与S7-200PLC之间用PPI通讯协议实现数据的读写源代码
2008-05-05 08:58
776 查看
通过对串口的监听,终于找到了PPI通讯协议对S7-200PLC数据读取的格式。下面是DELPHI 7的源代码。
var
i,j,fcs_read,fcs_write:integer;
nbyte,readdata_byte,writedata_byte:array of byte;
procedure Tshenchanform.FormCreate(Sender: TObject);
begin
nbyte:=vararrayof([16,2,0,92,94,22]); //确认信息返回给PLC。
fcs_read:=0;
readdata_byte:=vararrayof ([104,27,27,104,2,0,108,50,1,0,0,0,0,0,14,0,0,4,1,18,10,16,2,0,1,0,1,132,0,3,32,139,22]);//读数据
readdata_byte[32]:=22; //结束符
readdata_byte[29]:=trunc(890*8/256); //起始地址为vw890
readdata_byte[30]:=(890*8)mod 256;
readdata_byte[27]:=132; //读取数据为一个字
readdata_byte[24]:=110;//总共有110个字长
for i:=4 to 30 do
begin
fcs_read:=fcs_read +readdata_byte[i];
end;
readdata_byte[31]:=fcs_read mod 256; //校验码计算
mscomm1.output:=readdata_byte;//向串口传送字节
end;
procedure Tshenchanform.BitBtn1Click(Sender: TObject);
begin
s_pf[0]:=256;//要写入PLC的值
writedata_byte:=vararrayof([104,33,33,104,2,0,124,50,1,0,0,0,0,0,14,0,6,5,1,18,10,16,4,0,1,0,1,132,0,3,32,0,4,0,10,12,11,185,22]);
writedata_byte[38]:=22; //结束符
writedata_byte[22]:=4;//写入一个字
writedata_byte[24]:=1;//写入字长
writedata_byte[26]:=1;
writedata_byte[27]:=132;//写入字
writedata_byte[28]:=0;
writedata_byte[32]:=4;
writedata_byte[34]:=16;
writedata_byte[29]:=trunc(12000/256);//写入地址VW1500
writedata_byte[30]:=12000 mod 256;
writedata_byte[35]:=trunc(s_pf[0]/256);//写入的值
writedata_byte[36]:=(s_pf[0] mod 256);
for i:=4 to 36 do
begin
fcs_write:=fcs_write+writedata_byte[i];
end;
writedata_byte[37]:=fcs_write mod 256;//校验码
mscomm1.output:=writedata_byte;//向串口写入数据
end;
var
i,j,fcs_read,fcs_write:integer;
nbyte,readdata_byte,writedata_byte:array of byte;
procedure Tshenchanform.FormCreate(Sender: TObject);
begin
nbyte:=vararrayof([16,2,0,92,94,22]); //确认信息返回给PLC。
fcs_read:=0;
readdata_byte:=vararrayof ([104,27,27,104,2,0,108,50,1,0,0,0,0,0,14,0,0,4,1,18,10,16,2,0,1,0,1,132,0,3,32,139,22]);//读数据
readdata_byte[32]:=22; //结束符
readdata_byte[29]:=trunc(890*8/256); //起始地址为vw890
readdata_byte[30]:=(890*8)mod 256;
readdata_byte[27]:=132; //读取数据为一个字
readdata_byte[24]:=110;//总共有110个字长
for i:=4 to 30 do
begin
fcs_read:=fcs_read +readdata_byte[i];
end;
readdata_byte[31]:=fcs_read mod 256; //校验码计算
mscomm1.output:=readdata_byte;//向串口传送字节
end;
procedure Tshenchanform.BitBtn1Click(Sender: TObject);
begin
s_pf[0]:=256;//要写入PLC的值
writedata_byte:=vararrayof([104,33,33,104,2,0,124,50,1,0,0,0,0,0,14,0,6,5,1,18,10,16,4,0,1,0,1,132,0,3,32,0,4,0,10,12,11,185,22]);
writedata_byte[38]:=22; //结束符
writedata_byte[22]:=4;//写入一个字
writedata_byte[24]:=1;//写入字长
writedata_byte[26]:=1;
writedata_byte[27]:=132;//写入字
writedata_byte[28]:=0;
writedata_byte[32]:=4;
writedata_byte[34]:=16;
writedata_byte[29]:=trunc(12000/256);//写入地址VW1500
writedata_byte[30]:=12000 mod 256;
writedata_byte[35]:=trunc(s_pf[0]/256);//写入的值
writedata_byte[36]:=(s_pf[0] mod 256);
for i:=4 to 36 do
begin
fcs_write:=fcs_write+writedata_byte[i];
end;
writedata_byte[37]:=fcs_write mod 256;//校验码
mscomm1.output:=writedata_byte;//向串口写入数据
end;
相关文章推荐
- 用Ole Automation实现Delphi和AutoCad之间的数据交换
- python 实现TXT数据读写例子(源代码)
- 用Ole Automation实现Delphi和AutoCad之间的数据交换
- Android利用广播实现ViewPager中item之间的数据通信
- 数据库中两张表之间的数据同步增加、删除与更新实现思路
- Extjs4实现两个GridPanel之间数据拖拽功能具体方法
- 在Activity之间如何传递数据,请尽可能说出你所知道的传递数据的方法,并详细描述其实现过程。
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- Kettle 实现mysql数据库不同表之间数据同步——实验过程
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- Android编程实现两个Activity之间共享数据及互相访问的方法
- [转]如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- Oracle中通过Job实现定时同步两个数据表之间的数据
- Delphi中多线程用Synchronize实现VCL数据同步显示
- 用OpenGL的Image特性实现纹理数据的直接读写操作
- bootstrap-table实现两个表格之间数据的传递,表格添加行删除行功能
- 铁路列车之间的通信协议(MVB协议)分析软件C/C++实现(四) 数据解析
- liferay6.2通过事件机制实现不同portlet之间数据传递
- [Unity&GameSparks]如何实现玩家之间的数据共享
- SQL Server - 使用 Merge 语句实现表数据之间的对比同步