恭喜,你发布的帖子
发布于 2015-08-23 13:48:32
29楼
本人近期在试图设计一套大型物流输送程序,设计要求所有的程序需要模块化,普适性,对物流输送行业设备控制,任务管理与分解具有通用的应用价值。但物流输送系统所监控的设备各有特点,如何将控制程序模块化是本次设计的重点。物流输送所管理和控制的设备大至分为如下几种类型:棍子机及链条机、移载机、折盘机/码盘机、机器人码垛机/拆垛机,堆垛机、穿梭车。控制系统主要采用西门子S7-300和S7-1200系统,带以太网网络通讯,由于穿梭车和堆垛机是一种移动设备,故考虑采用以太网移动网络通讯。由于系统要与上位计算机系统相连,并通过网络计算机与公司仓库管理数据软件通过OPC SERVER软件与PLC系统进行数据连接,控制系统需接受WMS的任务指令。故软件编制对复杂的数据处理和任务处理考虑采用SCL语言编程,因SCL语言是一种类似于PASCAL的高级语言,非常适合做数据处理任务,具有很好的灵活性,本人是学工科的对计算机语言不是很精通,对siemens的SCL语言也是刚刚涉猎,特别是对SCL语言对数组的赋值不是很清楚,对两个数组类型的变量能否直接赋值一直心存疑惑,因为这要考虑PLC能否真正将我要传送的数组变量的数据传送到另一个数组变量的地址的问题,不知是否要对数组的每一个元素进行单独赋值还是可以只需简单的将变量名一次性赋值给另一个数组变量,这对数据处理的繁复性至关重要,因为对一个具有几十个数据的数组如果要一个一个地赋值那将是一个十分烦恼的事,如果有对数组变量赋值经验的专家能否给我一个指引,那将是对我很大的帮助,下面是我的一个编程片段,以供大家参考,如果能提供相关程序的编程指导,那将一定使我受益非浅,谢谢各位。
FUNCTION_BLOCK FB311
CONST
Tasknum_max:= 31;//系统能保存的最大任务数
Stationnum_max:= 31;//系统的最大站数
TaskQuantity:=Tasknum_max+1;
StationQuantity:=Stationnum_max+1;
END_CONST
// Block Parameters
VAR_INPUT
// Input Parameters
running:BOOL;
fault: BOOL;
new_task :UDT2 ;//添加的新任务(UDT2:自定义结构数据类型,表示上位机发送的任务内容)
newadd:BOOL; //执行添加新任务
Start:BOOL; //任务启动信号
cmd:INT; //0:停机,1:单步运行,2:连续运行,3手动调试(点动)---上位机发送的命令字
manu_dir:BOOL; //手动运行的方向
manu_auto:BOOL;//手动、自动切换
END_VAR
VAR_OUTPUT
// Output Parameters
END_VAR
VAR_TEMP
// Temporary Variables
index,num,sta_index:INT;
Run_data:ARRAY[1..Stationnum_max] OF UDT1; //存放各站的运行数据,UDT1:自定义的站运行数据结构
END_VAR
VAR_IN_OUT
taskindex:INT;
END_VAR
VAR
// Static Variables
sys_tasknum:INT:=0;
Task: ARRAY[0..Tasknum_max] OF UDT2; //系统发出的所有任务,系统最多可以保存32个任务
All_RunData:ARRAY[0..Tasknum_max,1..Stationnum_max] OF UDT1;//存放各站的每一个任务对应 //运行信息,数组下标1为任务索引,数组下标2为站索引,
//first_task_index:INT;
//save_Task:ARRAY[0..Tasknum_max] OF UDT2;
//CPJ1_data:FB204;
LTJ1,LTJ2,LTJ3,LTJ4,LTJ5:FB201;
END_VAR
// Statement Section
num:=0;
FOR index := 0 TO Tasknum_max BY 1 DO //计算系统任务总数
IF Task[index].taskno<>0 THEN
num:=num+1;
END_IF;
END_FOR;
sys_tasknum:=num;
//记住任务完成后任务号清零,
//任务完成后移动任务指针,后加入的任务前移,以便先发出的任务先执行(先进先出)。
IF Task[0].taskno=0 AND sys_tasknum<>0 AND newadd=1THEN
FOR index:= 0 TO Tasknum_max-1 BY 1 DO
// Statement Section
Task[index]:=Task[index+1];
END_FOR;
// Task[sys_tasknum].taskno:=0;//最后一个任务清零
END_IF;
//有新任务,添加新任务,加入任务队列
IF newadd AND sys_tasknum=0 THEN
//Task[sys_tasknum]:=new_task;//不知能否用此句一次性赋值以保存上位机的任务数据
Task[sys_tasknum].taskno:=new_task.taskno;
Task[sys_tasknum].fromstation:=new_task.fromstation;
Task[sys_tasknum].tostation:=new_task.tostation;
Task[sys_tasknum].tasktype:=new_task.tasktype;
Task[sys_tasknum].tasknum:=new_task.tasknum;
ELSIF newadd AND sys_tasknum<>0 AND sys_tasknum<=Tasknum_max AND new_task.taskno<>Task[sys_tasknum-1].taskno THEN //如果已经添加就不再添加
//Task[sys_tasknum]:=new_task;//不知能否用此句一次性赋值以保存上位机的任务数据
Task[sys_tasknum].taskno:=new_task.taskno;
Task[sys_tasknum].fromstation:=new_task.fromstation;
Task[sys_tasknum].tostation:=new_task.tostation;
Task[sys_tasknum].tasktype:=new_task.tasktype;
Task[sys_tasknum].tasknum:=new_task.tasknum;
END_IF;
newadd:=false;
//对系统中所有任务进行处理,分解系统任务到各站点,将任务号传送到相关站点,同时设定相关站点的运行方向
//主循环index:任务索引
FOR index:=0 TO sys_tasknum-1 BY 1 DO
// 略
END_FOR;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主