西门子S7200系列PLC PPI协议及PPI动态链接库DLLWord文件下载.docx
《西门子S7200系列PLC PPI协议及PPI动态链接库DLLWord文件下载.docx》由会员分享,可在线阅读,更多相关《西门子S7200系列PLC PPI协议及PPI动态链接库DLLWord文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
SSAP
DU
FCS
ED
SD:
(Start
Delimiter)开始定界符(68H)
LE:
(Length)报文数据长度
LER:
(Repeated
Length)重复数据长度
SA:
(Source
Address)源地址,指该地址;
DA:
(Destination
Address)目标地址,指该地址;
FC:
(Function
Code)功能码
DSAP:
Service
Access
Point)目的服务存取点
SSAP:
Point)源服务存取点
DU:
(Data
Unit)数据单元
FCS:
(Frame
Check
Sequence)校验码
ED:
(End
Delimiter)结束分界符(16H)
报文数据长度和重复数据长度为自DA至DU的数据长度,校验码为DA至DU数据的和校验,只取其中的末字节值.读写一般数据的功能码为
6CH,读CT数据、置位、复位、强制等的功能码为
7CH,确认命令功能码5CH。
2)、PLC接收到读写命令,校验后正确,返回的数据格式为
E5H
3)、确认读写命令的数据格式为:
其中SD为起始符,为10H
SA为数据源地址
DA为目的地址
FC为功能码,取5CH
FCS为SA+DA+FC的和的末字节
ED为结束符,取16H
4)、数据类型码
04:
S
05:
SM
06:
AI
07:
AQ
1E:
C
81:
I
82:
Q
83:
M
84:
V
1F:
T
5)、读写功能数据命令实例
1、给写VW3值1200
68
21
02
00
6C
32
01
0E
06
05
12
0A
10
84
18
04
B0
50
16
2、读取IB0的数据值
1B
81
64
根据上述例子用串口精灵测试一下,当发送命令成功PLC返回E5,你再发送10
5C
5E
16,就可以完成一次读写命令。
(记得接收和发送采用16进制方式
)
2.2
S7-200PLC
CPU内存地址范围(DLL所能寻址的范围)
被存取:
类型
CPU
221
222
224
226
位(字节.位)
V0.0-2047.7
0.0-2047.7
0.0-5119.7
1.22
1.23
0.0-8191.7
2.00
0.0-10239.7
2.00
XP
I0.0-15.7
0.0-15.7
0.0
-15.7
0.0-15.7
Q0.0-15.7
0.0-15.7
M0.0-31.7
0.0-31.7
-31.7
0.0-31.7
S0.0-31.7
SM0.0-179.7
0.0-299.7
-549.7
0.0-549.7
字节
VB0
-
2047
0
2047
5119
8191
10239
IB0
15
15
15
QB0
MB0
31
31
31
SB0
SMB0
179
299
549
549
字
VW
2046
2046
5118
8190
10230
255
255
AIW
30
62
62
AQW
双字
VD
2044
2044
5116
8188
10236
说明:
S7-200PLC的字、双字地址和字节地址实际上是重叠的,下面做个说明如:
VB0
VB1
VB2
VB3
VB4
VB5
VB6
VB7
VB8
VB9
VB10
VB11
VB12
VB13
VB14
VB15
----
----
VW0
VW2
VW4
VW6
VW8
VW10
VW12
VW14
--------—
--------—--------—
----------—
VD0
VD4
VD8
VD12
从上例可以看出PLC中字节、字与双字寻址的关系,当然如果你想使用VW1(VB1
VB2)、VD3(VB3
VB6)等寻址方式也是可以的,但为了减少不必要的寻址错误造成程序的非法执行建议:
字寻址时使用(V、I、Q、M等等)0、2、4、6、8、10
……,(这从PLC的模拟量输入/输出(AIW/AQW)的寻址就可以看出奇数地址是不允许的)双字寻址时使用(V、I、Q、M等等)0、4、8、12、16、20、24
…………………………,同时还要注意字节地址寻址最好也能不重叠;
C、T区当前值读取时的地址按实际地址0~255来。
三、DLL函数说明
1、打开串口
Function
ComOpen(nport,BaudRate,DataBits,Parity,StopBits:
longint;
User:
Pchar):
stdcall;
参数:
nport:
打开串口号,取值为1~8,代表COM1~COM8;
BaudRate:
波特率,取值为:
1200、2400、4800、9600、19200、38400;
DataBits:
数据位,取值为5、6、7、8;
Parity:
校验位,取值1(代表Even)、取值2(代表Odd)、取值3(代表Mark)、取值4(代表Space)、取值5(代表None);
StopBits:
停止位,取值1(代表1位停止位)、取值2(代表2位停止位)、取值3(代表1.5位停止位);
DLL授权用户名;
返回值:
长整型,操作成功返回“1”或“2”;
1表示注册授权用户,2表示用户未注册;
操作不成功返回为“0”时的原因:
1)、串口不存在或被占用;
2)、DLL注册授权不正确。
注:
本DLL用户不注册除了下面说明的功能限制外没有其他限制,未注册用户请使用特定用户名:
wangjun。
注册用户功能上无任何限制,且将得到永久的软件使用和更新升级服务;
使用举例:
Delphi:
ComOpen(1,9600,8,1,1,Pchar('
wangjun'
))
打开COM1口。
VB:
ComOpen(1,9600,8,1,1,"
wangjun"
)
2、关闭串口
ComClose(nport:
longint):
串口号,取值为1~8,代表COM1~COM8;
长整型,操作成功返回“1”,否则返回“0”;
ComClose
(1)
,关闭打开的COM1口。
3、PLC内部元件读取功能函数
PLC内部元件与数字的对应关系(DLL中的所有函数都遵循此规定):
:
I
1
Q
2
M
3
V
4
S
5
SM
6
AI
7
AQ
8
C
9
下面的读写等PLC操作函数使用举例都是按VB调用函数形式给出。
1)、字节元件数据读取
FcnBread(nport,purpose,source,name,address,Count:
Pchar;
purpose:
目标地址,取值0~126;
source:
源地址,取值0~126;
(这里是PLC的相应端口的PPI站地址,PLC的地址实际是从2开始的)
name:
取值0(代表I)、取值1(代表Q)、取值2(代表M)、取值3(代表V)、取值4(代表S)、取值5(代表SM);
address:
元件地址,取值为请参照
CPU内存地址范围;
Count:
读取的字节个数,最多读取128个但不能超出寻址范围;
字符串数据,字符串数据的终止符为"
@"
;
FcnBread(1,0,2,0,2,4),由COM1读取PPI
2号站
数据到0号站(计算机)IB2~IB5四个字节的值,如返回值为“01FF6403@”,
则表示IB2=01,
IB3=FF,IB4=64,IB5=03;
----------
--
字符串返回序列:
|
FF
03|
@
返回值为16进制字符串,将返回值如上2位一组,可转换成“0~255”间的整数值。
在读取错误或不能读取的情况下返回“Error@”
没有注册用户不能读取S、SM区字节值,可寻址范围IB0~IB1、QB0~QB1、MB0~MB1、VB0~VB1;
2)、字元件数据读取
FcnWread(nport,purpose,source,name,address,Count:
取值3(代表V)、取值6(代表AI)、取值8(代表C)、取值9(代表T);
读取的字个数,最多读取64个但不能超出寻址范围,T区读取时不超过44个;
FcnWread(1,0,2,3,0,4),由COM1读取PPI
数据到0号站(计算机)VW0~VW6四个字的值,如返回值为“006403E804B00010@”,
则表示VW0=0064,
VW2=03E8,VW4=04B0,VW6=0010;
-----------------
0064
03E8
04B0
0010
返回值为16进制字符串,将返回值如上4位一组,可转换成无符号“0~65535”或有符号“-32768
~
+32767”间的整数值。
如果你从PLC中读取的是有符号的数时,这个值小于等于32767,就得到你读的实际值,例如读到一个值“5EEE”转换成整数24302,
则实际值=+(24302-0)=+24302;
如果大于32767,例如我读到一个值“8FC0”先转换成整数36800,那实际值=-(36800-32768)=-4032。
没有注册用户不能读取C、T区字当前值,可寻址范围VW0~VW8、AIW0~AIW2;
3)、双字元件数据读取
FcnDWread(nport,purpose,source,name,address,Count:
取值3(代表V);
读取的双字个数,最多读取32个但不能超出寻址范围;
FcnDWread(1,0,2,3,0,2),由COM1读取PPI
则表示VD0=006403E8,VD4=04B00010;
--------------
006403E8
04B00010
返回值为16进制字符串,将返回值如上8位一组,可转换成无符号“0~4294967295”或有符号“-2147483648
+2147483647”间的整数值。
如果你从PLC中读取的是有符号的数时,这个值小于等于2147483647,就得到你读的实际值,例如读到一个值“5EEE8000”转换成整数为1592688640,则实际值=+(1592688640-0)=+1592688640;
如果大于2147483647,例如我读到一个值“8FEFC000”先转换成整数2414854144,那实际值=-(2414854144-2147483648)=-267370496。
在读取错误或不能读取的情况下返回“Error@”注:
没有注册用户可寻址范围VD0~VD4;
4)、位元件的状态读取
FcnBitread(nport,purpose,source,name,address,Bit:
Bit:
读取的字节元件的位地址如I1.0指I1字节元件的第0位;
长整数,返回为0表示状态为OFF,返回为1表示状态为ON,返回为-1表示读取错误或不能读取;
FcnBitread(1,0,2,0,1,7),由COM1读取PPI
数据到0号站(计算机)I1.7,如返回值为1,则表示I1.7=1;
没有注册用户不可以读取S、SM区状态,可寻址范围I0.0~I1.7、Q0.0~Q1.7、M0.0~M1.7、V0.0~V1.7;
4、PLC内部元件写数据功能函数
1)、字节元件数据写入
FcnBwrite(nport,purpose,source,name,address,Count:
Sendstr:
取值0(代表I)、取值1(代表Q)、取值2(代表M)、取值3(代表V)、取值4(代表S);
Count:
写入字节个数,这里1字节应写入2位16进制字符串;
给字节写入的值,该值为2个一组的16进制字符串组其取值为00~FF(整数值为0~255);
长整数,操作成功返回1,不能写入或操作错误返回0;
当要写入多个字节值时依次排列即可。
如给MB0与MB1写值100和80,先将100转成16进制字符串64、80
转成16进制字符串50,则sendstr=6450;
一次最多写128个字节即字符串长应小于等于256;
-
~
------
写字符串序列如:
08
|
实际字符串与位地址的数值应如下表:
(将上例的字节MB0'
、MB1'
转换为位地址