各位西门子PLC高手,小弟有一个问题想请教一下,望多多指教。
问题:
我想有S7300做一个功能块,
输入3个数据,(分别是:配方号一个字r,工位号一个字p,查询请求一个位q)
输出15个数据(分别是这个工位上的15个工艺参数a.b.c .d.e.f.g.h.i .j.k.l.m.n.o)其中,这15个数据存在DB10里面的一个二维数据表里,这个表有38行,15列,每15个数据作为一个工位的15个参数都有规律的存在这个表中的一行里面。
请教如何实现,本人初学300PLC 不太会用,望手们给小弟讲一下,越详细越好,小的在这里不甚感谢!
问题补充:
哦,下面一天到晚游泳的大师给的方案看上去我是比较喜欢,非常感谢,只是我照你的做了,我怎么也找不到FC500和FC501,能否帮我测试一下你的程序,我不知问题出在哪里。
谢谢!
产品版区:SIMATIC S7-300(F)/S7-400(F/H/FH)
悬赏分:30 | 解决时间:2011-07-26 16:27:43 | 提问者: 向往明天 勇往直前 - 新生  第1级
最佳答案
FUNCTION FC500 : VOID
BEGIN
DB3.DATA[1,1]:=1.0;
DB3.DATA[1,2]:=2.0;
DB3.DATA[1,3]:=3.0;
DB3.DATA[1,4]:=4.0;
DB3.DATA[2,1]:=1.0;
DB3.DATA[2,2]:=2.0;
DB3.DATA[2,3]:=3.0;
DB3.DATA[2,4]:=4.0;
END_FUNCTION
FUNCTION FC501 : VOID
VAR_INPUT
P:INT;
Q:BOOL;
END_VAR
VAR_OUTPUT
A:REAL;
B:REAL;
C:REAL;
D:REAL;
E:REAL;
F:REAL;
G:REAL;
H:REAL;
I:REAL;
J:REAL;
K:REAL;
L:REAL;
M:REAL;
N:REAL;
O:REAL;
ERROR:BOOL;
END_VAR
BEGIN
IF Q=TRUE AND P>=1 AND P<=38 THEN
A:=DB3.DATA[P,1];
B:=DB3.DATA[P,2];
C:=DB3.DATA[P,3];
//后面自己加
//如果输出参数用一个数组,这段程序就可以用一个循环写了
ERROR:=FALSE;
ELSE
ERROR:=TRUE;
END_IF;
END_FUNCTION
回答者:
一天到晚游泳的猪
-
中级工程师  第10级
2011-07-19 09:47:07
提问者对于答案的评价:
谢谢!
建议使用SCL编程语言处理,具体可以参考SCL中对数组的处理
回答者: zhou wen dong - 高级技术员  第7级
2011-07-19 00:29:24
这个建议到上位机去做,利用数据库的功能来做,到PLC里面处理比较麻烦,
回答者: xsxzc - 中级工程师  第10级
2011-07-19 10:09:55
scl语言,还要继续努力
回答者: lee nd2009 - 初级工程师  第9级
2011-07-19 10:58:00
用STL语言也可以,DB10数据中的地址作为变量, 存储的数据与地址也一一对应,找到相应地址,就取相应的数据,用指针变量比较方便。
回答者: 脚下为零 - 新生  第1级
2011-07-19 20:17:27
DATA_BLOCK DB10
//
// 这里是db10创建部分
//
STRUCT
//定义一个二维数组,38行(38个配方),15列(15个工号)内容word(满足15位)。w#0是初始值为例,不需要可以直接去掉。
Parameter : ARRAY[1..38,1..15] OF WORD :=570(w#16#0);//工艺参数
str:STRING[15]:='abcdefghijklmno';
pro:STRING[15]:=' ';
END_STRUCT
BEGIN
//这里可以写初始值,有规律可以用excle等生成转成文本粘贴到这里。也可以在ob100里面赋值。
//我这里写的胡乱填的,为了测试。
Parameter [1,1]:=word#16#1;
Parameter [1,2]:=word#16#ab;
Parameter [2,1]:=word#16#1fad;
END_DATA_BLOCK
FUNCTION FC10 : bool
// 给定一个配方和工号,求工艺参数。查表法实现。
VAR_INPUT
//输入参数,配方和工号。
RecipeNo : INT; //配方
EmployeeNo : INT; //工号
END_VAR
VAR_OUTPUT
// 输出工艺参数
Parameter :STRING[15]; // 工艺参数
END_VAR
VAR_TEMP
s:STRING[15];
chr:STRING[1];
i:INT;
END_VAR
//初始化
s:='';
//输入在范围内,返回工艺参数,否则返回字符串''。函数返回值为是否调用成功
IF (RecipeNo>0) AND (RecipeNo<39) AND (EmployeeNo>0) AND (EmployeeNo<16) THEN
//这里直接用循环做。其实用while会更高效,你自己可以尝试一下。
FOR i:=0 TO 14 DO
//如果第i位为1那么就输出'abcdefghijklmno'中第i位。其实可以直接放到db10里面去。
IF (SHR (IN:=db10.Parameter[RecipeNo,EmployeeNo], N:=i ) AND W#16#1)=W#16#1 THEN
chr:=MID (IN:= 'abcdefghijklmno', L:= 1, P:= i);
s:=CONCAT(IN1:= s, IN2:=chr);
FC10:=true;
ELSE
FC10:=false;
END_IF;
END_FOR;
END_IF ;
END_FUNCTION
回答者: t1122 - 学长  第2级
2011-07-23 13:45:45
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!