发表于:2010-11-06 18:38:04
10楼
ORGANIZATION_BLOCK 主程序:OB1
TITLE=
VAR
无用:BOOL;
转换中间值:DWORD;
END_VAR
BEGIN
Network 1
LD SM0.1
CALL SBR0
Network 2
LSCR S0.0
Network 3 // 这里要定义好发送控制和接收控制的标志位。确立通讯中断关系。
LD SM0.0
CALL SBR3
SCRT S0.1
Network 4
SCRE
Network 5
LSCR S0.1
Network 6 // 对于读参数,不变的值
// 填写发送缓冲区。需要填写 站址;储存类别;地址L;地址M;地址H
LD SM0.0
MOVB 3, VB7
MOVB 3, VB20
MOVB 1, VB21
MOVB 1, VB22
MOVB 0, VB23
Network 7
LD SM0.0
CALL SBR6
SCRT S0.2
INCD AC0
Network 8
SCRE
Network 9 // 这里要判断超时;接收的错误;数据是否被修改。
LSCR S0.2
Network 10 // 一进入就开始计算通讯时间。
LDN M14.1
TON T40, 5
Network 11 // 通讯超时,远程没有响应,马上禁止接收。报告超时。
LD T40
EU
S M14.5, 1
R SM187.7, 1
RCV VB50, 1
Network 12 // 接收中断产生。应答信息等待处理。
// 这是32位BCD码转换32位十进制过程。
LD M14.0
= M14.1
CALL SBR5, VD79, L0.0, VD100
R M14.5, 1
R M14.0, 1
= Q0.0
Network 13
// 在接收回来的信息当中报警位有报警了,作一个标志。
LD M14.1
LPS
A V76.0
S M14.4, 1
LPP
AN V76.0
R M14.4, 1
Network 14 // 无报警、无消警请求,接收相等,切换协议M 超时了也不管了。切换M。
// 接收回来的参数与记录中的参一致。则无须再发送。直接转到协议m切换
// 读参数超时
LDN M14.4
ON M14.7
A M14.1
AD= VD100, VD400
O T40
LPS
AN SM0.0
SCRT S0.7
LPP
A SM0.0
SCRT S0.1
R T40, 1
Network 15 // 收完。不管值等不等,有消警要求就消警。
LD M14.1
A M14.4
A M14.7
SCRT S0.5
Network 16 // 收完。值不等。只有无报警了才写值。
LDN M14.4
AN M14.7
A M14.1
AD<> VD100, VD400
SCRT S0.3
Network 17
SCRE
Network 18
LDN M14.4
R M14.7, 1
Network 19
LSCR S0.3
Network 20 // 对于写参数,不变的值
// 填写发送缓冲区。需要填写 站址;储存类别;地址L;地址M;地址H
LD SM0.0
MOVB 3, VB7
MOVB 3, VB20
MOVB 1, VB21
MOVB 1, VB22
MOVB 1, VB23
Network 21
LD SM0.0
MOVB 0, VB26
CALL SBR10, VD400, L0.0, VD27
Network 22
LD L0.0
CALL SBR6
SCRT S0.4
INCD AC0
Network 23
SCRE
Network 24
LSCR S0.4
Network 25
LDN M14.0
TON T41, 5
Network 26
LD T41
EU
S M14.5, 1
R SM187.7, 1
RCV VB50, 1
Network 27
LD M14.0
= M14.2
R M14.5, 1
R M14.0, 1
= Q0.1
Network 28
// 只作标记不进行处理。
LD M14.2
A V76.6
S M14.6, 1
Network 29
LD M14.2
A V76.0
S M14.4, 1
Network 30 // 调试改过
LD M14.2
O T41
LPS
AN SM0.0
SCRT S0.7
LRD
A SM0.0
SCRT S0.1
LPP
R T41, 1
Network 31
SCRE
Network 32
LSCR S0.5
Network 33
// 填写准备发送的信息
LD SM0.0
MOVD 16#08000117, VD20
MOVW 0, VW24
Network 34 // 【发伺服6】程序自动计算 24 数据长度 2 数据数 18 数据部计数 14 指令
LD SM0.0
CALL SBR6
SCRT S0.6
INCD AC0
Network 35
SCRE
Network 36
LSCR S0.6
Network 37
LDN M14.3
TON T42, 5
Network 38
LD T42
EU
S M14.5, 1
R SM187.7, 1
RCV VB50, 1
Network 39 // 调试修改0.7改0.1
LD M14.0
S M14.3, 1
R M14.5, 1
R M14.0, 1
= Q0.2
Network 40
LD T42
O M14.3
LPS
R M14.3, 1
A SM0.0
SCRT S0.1
LPP
AN SM0.0
SCRT S0.7
Network 41
SCRE
Network 42
// ========================================================================================
// ========================================================================================
// ========================================================================================
// ========================================================================================
// ========================================================================================
LSCR S0.7
Network 43
LD SM0.0
S M15.0, 1
Network 44
LD M15.2
SCRT S1.0
Network 45
SCRE
Network 46
// 让Mbus_Ctrl指令执行一个周期后再继续。
LD M15.0
= M15.2
Network 47
LSCR S1.0
Network 48 // 信息包括: 从站地址 读写状态 MODBUS地址 数据数 缓冲区间接寻址
Network 49 // 固定内容
// 指示通讯为读状态。
// 给定通讯对象的地址。
// 连续数据数。
LD SM0.0
MOVB 0, VB202
MOVD 40045, VD203
MOVW 1, VW207
Network 50 // 可变内容
// 初始化要定义正确站号。变频器站号从3开始。7是空的第一个站址。
LDB>= VB201, 7
MOVB 3, VB201
Network 51 // 可变内容
// 根据目前站号,更新通讯缓冲区指针。
// 资料填写完毕。提交申请
LDN M15.1
LPS
AB= VB201, 3
MOVW 300, VW211
LRD
AB= VB201, 4
MOVW 302, VW211
LRD
AB= VB201, 5
MOVW 304, VW211
LRD
AB= VB201, 6
MOVW 306, VW211
LPP
S M15.1, 1
Network 52
// 请求已经接纳。
LDN M24.2
SCRT S1.1
Network 53
SCRE
Network 54
LSCR S1.1
Network 55
// 已经有结果了。兼做出错处理。
LDN M15.1
A M24.2
SCRT S1.2
AB<> VB213, 0
S M24.3, 1
Network 56
SCRE
Network 57
LSCR S1.2
Network 58
// 更新通讯参数,准备下一个站的通讯。
//
// 信息包括:
// 从站地址
// 读写状态
// MODBUS地址
// 数据数
// 缓冲区间接寻址
Network 59 // 固定内容
LDN M15.1
LPS
MOVB 1, VB202
MOVD 40002, VD203
MOVW 2, VW207
AB= VB201, 3
MOVW 310, VW211
LRD
AB= VB201, 4
MOVW 314, VW211
LRD
AB= VB201, 5
MOVW 318, VW211
LRD
AB= VB201, 6
MOVW 322, VW211
LPP
S M15.1, 1
Network 60
LDN M24.2
SCRT S1.3
Network 61
SCRE
Network 62
LSCR S1.3
Network 63
// 已经有结果了。兼做出错处理。
LDN M15.1
A M24.2
LPS
EU
INCB VB201
LRD
AN C0
SCRT S1.0
LRD
A C0
R M15.0, 1
SCRT S0.0
LPP
AB<> VB213, 0
S M24.3, 1
Network 64
SCRE
Network 65
// 这是计算MODBUS通讯多少次后伺服再通讯1次。
LD S1.3
LD C0
CTU C0, VW404
Network 66
LD M15.0
= L60.0
LD M15.0
= L63.7
LD L60.0
CALL SBR2, L63.7, 9600, 2, 1000, M24.1, VB200
Network 67
LD M15.0
= L60.0
LD M15.1
A M24.2
= L63.7
LD L60.0
CALL SBR7, L63.7, VB201, VB202, VD203, VW207, VD209, M24.2, VB213
Network 68
LD M15.1
EU
= M15.3
Network 69
LD M24.2
R M15.1, 1
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK 初始0:SBR0
TITLE=
BEGIN
Network 1
LD SM0.0
ENI
Network 2
LD SM0.0
MOVD 16#01000000, SD0
Network 3
// 变频器通讯站号由3开始。
LD SM0.0
MOVB 3, VB201
Network 4
// 接收缓冲区从vb300开始
LD SM0.0
MOVD &VB300, VD209
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 域和:SBR1
TITLE=子程序注释
// 程序目的:
// 把指定连续V区域中的整数进行求和。
// 适用范围:
// 不适合在中断中使用。建议在使用时通过边缘指令调用一次。
// 参数类型:
// 连续数 字。总共参与计算的字的个数。
// 起始位 偏移量,字。第一个数据的地址相对VB0的增量。
// 模式 字节。计算对象的位长。0:8位;1:16位;2:32位。
// 执行过程:每执行一次得到一次计算结果。
// 程序密码:YH
VAR_INPUT
连续数:WORD;
首址偏移:WORD; // 这是对VB0的偏移量。
模式:BYTE; // 0:字节;1:字;2:双字
END_VAR
VAR_OUTPUT
域和:DWORD;
END_VAR
VAR
循环值:WORD;
过程量:DWORD;
起始位:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUS_CTRL_P1:SBR2
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“Modbus 主站端口 1 库”的一部分。
VAR_INPUT
Mode:BOOL; // 1 = Modbus, 0 = PPI(终止 Modbus)
Baud:DWORD; // 1200, 2400 ... 115200
Parity:BYTE; // 0 = 无,1 = 奇校验,2 = 偶校验
Timeout:INT; // 以毫秒表示的从站响应超时
END_VAR
VAR_OUTPUT
Done:BOOL; // 完成标记(始终设置)
Error:BYTE; // 错误状态
END_VAR
VAR
AC0save:DWORD;
AC1save:DWORD;
AC2save:DWORD;
AC3save:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 协议S3:SBR3
TITLE=子程序注释
BEGIN
Network 1
LD SM0.0
MOVB 2#1001001, SMB130
Network 2 // 发送完成定义中断
LD SM0.0
ATCH INT0, 26
ATCH INT1, 24
Network 3 // SC 起始字符
LD SM0.0
= SM187.6
Network 4 // ec 结束字符
LDN SM0.0
= SM187.5
Network 5 // il 空闲线时间
LD SM0.0
= SM187.4
Network 6 // c/m 字符间隔计时/信息间隔计时
LDN SM0.0
= SM187.3
Network 7 // trm 超时
LD SM0.0
= SM187.2
Network 8 // bk 断点条件
LDN SM0.0
= SM187.1
Network 9 // 固定是0
LDN SM0.0
= SM187.0
Network 10 // 起始字符
LD SM0.0
MOVB 16#5A, SMB188
Network 11 // 空闲线时间
LD SM0.0
MOVW 2, SMW190
Network 12 // 超时结束
LD SM0.0
MOVW 50, SMW192
Network 13 // 最大字符数
LD SM0.0
MOVB 50, SMB194
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 协议M4:SBR4
TITLE=子程序注释
BEGIN
Network 1 // 网络标题
// 网络注释
LD SM0.0
DTCH 24
DTCH 26
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK BCD_DI:SBR5
TITLE=
// LIBARY: BCD
// ===========
//
//
// LIABILITY
// Siemens AG does not accept liability of any kind for damages arising from the use of this application, except where it is obliged to by law, in cases such as damage to items used for personal purposes, personal injury, willful damage or gross negligence.
//
// WARRANTY
// The program examples given are specific solutions to complex tasks which were worked on by Customer Support. We must also point out that it is not possible in the current state of the technology to exclude all errors in software programs under all conditions of use. The program examples were prepared according to the best of our knowledge. However, we cannot accept any liability beyond the standard guarantee for Class C software in accordance with our General Terms of Sale for Software Products for Automation and Drive Technology". The program examples can be purchased on the Internet as single licenses. They may not be transferred to a third party.
//
// PASSWORD
// The password of the library is "1234"
//
// BCD_DI
// BCD to Double Integer Conversion
//
// Inputs/Outputs Operands Data Types
// IN (LAD, FBD) VD, ID, QD, MD, SD, SMD, LD, T, C, AID, AC, Constant, *VD, *AC, *LD DINT
// OUT VD, ID, QD, MD, SD, SMD, LD, T, C, AC, *VD, *LD, *AC DINT
//
// The BCD to Double Integer instruction converts the binary-coded decimal value IN to an double integer value and loads the result into the variable specified by OUT. The valid range for IN is 0 to 99999999 (BCD).
//
// The ENO-bit (output enable) is set in the valid range of values and 0 if the input-values are out of range.
VAR_INPUT
IN:DINT;
END_VAR
VAR_OUTPUT
ENO:BOOL;
OUT:DINT;
END_VAR
VAR
TEMP1:INT;
TEMP2:DINT;
TEMP3:DINT;
TEMP4:INT;
TEMP5:DINT;
TENO1:BOOL;
TENO2:BOOL;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 发伺服6:SBR6
TITLE=本程序自动计算
// 24 数据长度
// 2 数据数
// 18 数据部计数
// 14 指令
VAR
连续数:INT;
发送指针:DWORD;
偏移:INT;
和首指针:DWORD;
BCC位置:DWORD;
连续数D:DWORD;
和32位:DWORD;
END_VAR
BEGIN
Network 1
// 确定数据长度。读参数。
LDB= VB23, 0
MOVB 7, VB24
Network 2
// 确定数据长度。写参数。
LDB= VB23, 1
MOVB 5, VB24
Network 3
// 确定数据长度。复报警。
LDB= VB23, 16#17
MOVB 0, VB24
Network 4 // 数据部计算 读参数和复位报警。 数据数计算
LDB= VB23, 0
OB= VB23, 17
MOVB 6, VB18
MOVB 23, VB2
Network 5 // 数据部计算 写参数。 数据数计算
LDB= VB23, 1
MOVB 11, VB18
MOVB 28, VB2
Network 6 // 指令
LDB= VB23, 0
MOVB 16#50, VB14
Network 7 // 指令
LDB= VB23, 1
OB= VB23, 17
MOVB 16#51, VB14
Network 8 // 计算发送字节数
LD SM0.0
MOVB VB2, VB0
INCB VB0
INCB VB0
INCB VB0
Network 9 // 计算BCC位置
LD SM0.0
LPS
MOVD &VB0, LD2
AENO
MOVD LD2, LD8
+D +2, LD8
LRD
BTI VB2, LW0
AENO
INCW LW0
AENO
ITD LW0, LD16
LPP
MOVD LD8, LD12
+D LD16, LD12
Network 10
LD SM0.0
CALL SBR1, LW0, LW10, 0, LD20
INVD LD20
INCD LD20
INCD AC0
XMT VB0, 1
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUS_MSG_P1:SBR7
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“Modbus 主站端口 1 库”的一部分。
VAR_INPUT
First:BOOL; // 新消息(设置为 1 时仅对新请求扫描一次)
Slave:BYTE; // 从站地址(0 到 247)
RW:BYTE; // 读 = 0,写 = 1
Addr:DWORD; // Modbus 地址(即 40001)
Count:INT; // 元素个数(1 到 120 个字或 1 到 1920 位)
DataPtr:DWORD; // 数据指针(即 &VB100)
END_VAR
VAR_OUTPUT
Done:BOOL; // 完成标记(0 = 忙,1 = 完成)
Error:BYTE; // 错误(0 = 无错误)
END_VAR
VAR
AC0save:DWORD;
AC1save:DWORD;
AC2save:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK MBUSM1_P1:SBR8
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“Modbus 主站端口 1 库”的一部分。
VAR_OUTPUT
crc:WORD;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK DI_BCD:SBR10
TITLE=
// LIBARY: BCD
// ===========
//
//
// LIABILITY
// Siemens AG does not accept liability of any kind for damages arising from the use of this application, except where it is obliged to by law, in cases such as damage to items used for personal purposes, personal injury, willful damage or gross negligence.
//
// WARRANTY
// The program examples given are specific solutions to complex tasks which were worked on by Customer Support. We must also point out that it is not possible in the current state of the technology to exclude all errors in software programs under all conditions of use. The program examples were prepared according to the best of our knowledge. However, we cannot accept any liability beyond the standard guarantee for Class C software in accordance with our General Terms of Sale for Software Products for Automation and Drive Technology". The program examples can be purchased on the Internet as single licenses. They may not be transferred to a third party.
//
// PASSWORD
// The password of the library is "1234"
//
// DI_BCD
// Double Integer to BCD Conversion
//
// Inputs/Outputs Operands Data Types
// IN (LAD, FBD) VD, ID, QD, MD, SD, SMD, LD, T, C, AID, AC, Constant, *VD, *AC, *LD DINT
// OUT VD, ID, QD, MD, SD, SMD, LD, T, C, AC, *VD, *LD, *AC DINT
//
// The Double Integer to BCD instruction converts the input double integer value IN to a binary-coded decimal and loads the result into the variable specified by OUT. The valid range for IN is 0 to 99999999.
//
// The ENO-bit (output enable) is set in the valid range of values and 0 if the input-values are out of range.
VAR_INPUT
IN:DINT;
END_VAR
VAR_OUTPUT
ENO:BOOL;
OUT:DINT;
END_VAR
VAR
TEMP1:DINT;
TEMP2:DINT;
TEMP3:DINT;
TEMP4:DINT;
TENO1:BOOL;
TENO2:BOOL;
END_VAR
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK S发完0:INT0
TITLE=此中断程序的连接是在【协议S3】子程序中定义的。
BEGIN
Network 1 // 发送完成中断
// 网络注释
LD SM0.0
= SM187.7
RCV VB50, 1
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK S收完1:INT1
TITLE=此中断程序的连接是在【协议S3】子程序中定义的。
BEGIN
Network 1 // 接收完成中断
LD SM0.0
= M14.0
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK MBUSM2_P1:INT2
TITLE=本代码归西门子能源与自动化公司专有,它属于附加软件包“Modbus 主站端口 1 库”的一部分。
BEGIN
Network 1 // 此 POU 受密码保护,不能编辑和查看。
END_INTERRUPT_BLOCK