新项目用博图,但是电脑配置太渣,所以两台电脑同时开,有时候用另一台的STEP7编程序,导出来在导入到博图。
- STEP7里打开需要生成源程序的块
- 点击“文件”–“生成源文件”
- 输入名称点确定
- 选择对应的块,地址选择“符号”这样可移植性好
- 生成的源文件可以在项目程序的“源文件”中看到
可以看到这里和SCL语言非常类似
后记,导入博图后用源文件生成的块是无法转换语言的,因为源文件是STL格式,所以导入后还是STL格式,且无法转换为LAD格式。
FUNCTION_BLOCK “mot.”
TITLE =
VERSION : 0.1
VAR_INPUT
iMode : INT ;
bAuto : BOOL ;
bMan1 : BOOL ;
bMan2 : BOOL ;
bMaint1 : BOOL ;
bMaint2 : BOOL ;
bDisa1 : BOOL ;
bDisa2 : BOOL ;
bFalt1 : BOOL ;
bFalt2 : BOOL ;
bFalt3 : BOOL ;
cNO_1 : COUNTER ;
cNO_2 : COUNTER ;
cSet : INT ;
tNo_1 : TIMER ;
tNo_2 : TIMER ;
END_VAR
VAR_IN_OUT
bOp1 : BOOL ;
bOp2 : BOOL ;
bVf : BOOL ;
bflag : BOOL ;
END_VAR
VAR_TEMP
sss : WORD ;
ddd : INT ;
no_0 : BOOL ;
no_1 : BOOL ;
no_2 : BOOL ;
x : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
O #x;
ON #x;
= L 5.0;
A L 5.0;
A( ;
L #iMode;
L 0;
==I ;
) ;
= #no_0;
A L 5.0;
A( ;
L #iMode;
L 1;
==I ;
) ;
= #no_1;
A L 5.0;
A( ;
L #iMode;
L 2;
==I ;
) ;
= #no_2;
NETWORK
TITLE =
A( ;
A( ;
A( ;
A #bAuto;
A( ;
A #no_0;
AN #bflag;
O ;
AN #no_0;
A #no_1;
O #bFalt2;
O #bDisa2;
) ;
O ;
AN #bAuto;
A #bMan1;
) ;
AN #bFalt1;
O ;
AN #bAuto;
A #bMaint1;
) ;
AN #bDisa1;
O #tNo_2;
) ;
AN #bOp2;
= #bOp1;
NETWORK
TITLE =
A( ;
A( ;
A #bOp1;
A M 0.5;
CU #cNO_1;
BLD 101;
NOP 0;
NOP 0;
A #bflag;
R #cNO_1;
L #cNO_1;
T #sss;
NOP 0;
A #cNO_1;
) ;
JNB _001;
L #sss;
T #ddd;
SET ;
SAVE ;
CLR ;
_001: A BR;
) ;
A( ;
L #ddd;
L #cSet;
>=I ;
) ;
S #bflag;
NETWORK
TITLE =
A( ;
A( ;
A( ;
A #bAuto;
A( ;
A #no_0;
A #bflag;
O ;
AN #no_0;
A #no_2;
O #bFalt1;
O #bDisa1;
) ;
O ;
AN #bAuto;
A #bMan2;
) ;
AN #bFalt2;
O ;
AN #bAuto;
A #bMaint2;
) ;
AN #bDisa2;
O #tNo_2;
) ;
AN #bOp1;
= #bOp2;
NETWORK
TITLE =
A( ;
A( ;
A #bOp2;
A M 0.5;
CU #cNO_2;
BLD 101;
NOP 0;
NOP 0;
AN #bflag;
R #cNO_2;
L #cNO_2;
T #sss;
NOP 0;
A #cNO_2;
) ;
JNB _002;
L #sss;
T #ddd;
SET ;
SAVE ;
CLR ;
_002: A BR;
) ;
A( ;
L #ddd;
L #cSet;
>=I ;
) ;
R #bflag;
NETWORK
TITLE =
A( ;
A #bAuto;
A( ;
A( ;
A #no_0;
AN #bflag;
O ;
AN #no_0;
A #no_1;
O #bFalt2;
O #bDisa2;
) ;
A #bOp1;
O ;
A( ;
A #no_0;
A #bflag;
O ;
AN #no_0;
A #no_2;
O #bFalt1;
O #bDisa1;
) ;
A #bOp2;
) ;
O ;
A( ;
O #bMan1;
O #bMan2;
O #bMaint1;
O #bMaint2;
) ;
A( ;
O #bOp1;
O #bOp2;
) ;
) ;
AN #bFalt1;
AN #bFalt2;
AN #bFalt3;
L S5T#3S;
SD #tNo_1;
NOP 0;
NOP 0;
NOP 0;
A #tNo_1;
= #bVf;
NETWORK
TITLE =
A #bVf;
L S5T#3S;
SF #tNo_2;
NOP 0;
NOP 0;
NOP 0;
NOP 0;
END_FUNCTION_BLOCK
最后附上块,网络1中有L 0.5这个临时变量,在STEP7中是可以通过的
但是在博图中是无法通过编译的,会提示“临时变量仅可进行符号寻址”
解决方法有两个,
第一种方法,建议使用at覆盖变量。见图1。
在图1中,temp1是一个word类型,可以直接对它操作,如果想对它(temp1)里的位进行操作,可以使用abc这个变量,abc这个变量是temp1的副本(at变量),它们是等同的。可以看到它们地址是相同的。
关于at变量的操作,可以看portalv11软件中的帮助。或者看手册“step7professionalv11.0sp2”
下载地址:step7professionalv11.0sp2
http://support.automation.siemens.com/cn/view/zh/57185407
请看9.1章节的“使用at覆盖变量”,见图2。
第二种方法,建议使用slice方法。见图3。
在图3中,程序段1中,直接对temp1的位(如#temp1.x0等)做操作,若想对字节操作,可以填写#temp1.b0即可。
关于slice方法的帮助看手册“step7professionalv11.0sp2”
也是看9.1章节的“对变量各位的寻址”。见图4。