西门子S7 dll vb文档格式.docx
《西门子S7 dll vb文档格式.docx》由会员分享,可在线阅读,更多相关《西门子S7 dll vb文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
![西门子S7 dll vb文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/21/61534b73-6853-4f95-9343-ff30d93c2eee/61534b73-6853-4f95-9343-ff30d93c2eee1.gif)
的响应,上位机接到此响应则发出确认申请命令,PLC则完成正确的读写响应,回应给上位机数据。
这样收发两次数据,完成一次数据的读写
(从这里可以看出PPI协议的通讯效率并不好,一次读写需收发两次数据^_^)。
其通讯数据报文格式大致有以下几类:
1)、读写申请的数据格式如下:
SD
LE
LER
DA
SA
FC
DASP
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进制方式
o(∩_∩)o...哈哈)
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。
没有注册用户可寻址范围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);