求助日本大隈 OKUMA 系统 主程序调用多个子程序方法,调度程序用法~谢谢!!感激不尽!MAR-500H

求助日本大隈 OKUMA 系统 主程序调用多个子程序方法,调度程序用法~谢谢!!感激不尽!MAR-500H,第1张

OKUMA呼叫子程序方法如下

一般呼叫:CALL O1235 (等同FANUC的M98 P1235)

模态呼叫: MODIN O1235 (等同FANUC的G66 P1235)

程序动作完成后需用G100或MODOUT取消模态循环

sets:

plane/1..10/:x,fine,earliest,lastest,target

link(plane,plane):wait,y

endsets

data:

!最早到达时间

earliest=129 195 89 96 110 120 124 126 135 160

!最晚到达时间

lastest=559 744 510 521 555 576 577 573 591 657

!目标时间

target=155 258 98 106 123 135 138 140 150 180

!罚金

fine=10 10 30 30 30 30 30 30 30 30

!相邻降落之间的间隔时间矩阵

wait=0 3 15 15 15 15 15 15 15 15 !1

3 0 15 15 15 15 15 15 15 15 !2

15 15 0 8 8 8 8 8 8 8 !3

15 15 8 0 8 8 8 8 8 8 !4

15 15 8 8 0 8 8 8 8 8 !5

15 15 8 8 8 0 8 8 8 8 !6

15 15 8 8 8 8 0 8 8 8 !7

15 15 8 8 8 8 8 0 8 8 !8

15 15 8 8 8 8 8 8 0 8 !9

15 15 8 8 8 8 8 8 8 0!10

enddata

min=@sum( plane:fine(i)*@abs( x(i)-target(i) ) )

@for(plane(i):@bnd(earliest(i),x(i),lastest(i)))!最早降落时间和最迟降落时间限制

@for(plane(i):@for(plane(j) | i#ne#j:y(i,j)=@if(x(i) #le# x(j),1,0)))!飞机i比飞机j早降落,y(i,j)=1,否则为0

@for(link(i,j) | i#ne#j:(y(i,j)+y(j,i))=1)

@for(plane(i):@for(plane(j) | i#ne#j:x(i)+wait(i,j)<=x(j)))

@for(plane:@gin(x))

@for(link:@bin(y))

这个代码大概可以表示,但是还是有错误,期待高手修改一下。

public class PrivilegeProcess {

public static void main(String[] args) {

MyQueue myqueue = new MyQueue()//声明队列

PCB[] pcb = {new PCB(001,8,1),new PCB(002,7,9),new PCB(003,3,8),new PCB(004,1,7),new PCB(005,7,4)}

PCB para = new PCB()

for(int i=0i<pcb.lengthi++){//初始化后首先执行一次排序,这里使用的是选择排序,优先级高的先入队

for(int j=ij<pcb.lengthj++){

if(pcb[i].privilege <pcb[j].privilege){

para = pcb[i]

pcb[i] = pcb[j]

pcb[j] = para

}

}

}

System.out.println("初次入队后各进程的顺序:")

for(int i=0i<pcb.lengthi++){

System.out.println("初次入队后 # processname : " + pcb[i].name + " totaltime : " + pcb[i].totaltime + " privilege :" + pcb[i].privilege)

}

System.out.println()

myqueue.start(pcb)

}

}

class MyQueue {

int index = 0

PCB[] pc = new PCB[5]

PCB[] pc1 = new PCB[4]

PCB temp = new PCB()

public void enQueue(PCB process){//入队算法

if(index==5){

System.out.println("out of bounds !")

return

}

pc[index] = process

index++

}

public PCB deQueue(){//出队算法

if(index==0)

return null

for(int i=0i<pc1.lengthi++){

pc1[i] = pc[i+1]

}

index--

temp = pc[0]

for(int i=0i<pc1.lengthi++){

pc[i] = pc1[i]

}

return temp

}

public void start(PCB[] pc){//显示进程表算法

while(pc[0].isNotFinish==true||pc[1].isNotFinish==true||pc[2].isNotFinish==true||pc[3].isNotFinish==true||pc[4].isNotFinish==true){

//*注意:||运算符,所有表达式都为false结果才为false,否则为true

for(int i=0i<pc.lengthi++){

pc[i].run(this)

}

System.out.println()

for(int i=0i<pc.lengthi++){//所有进程每执行完一次时间片长度的运行就重新按优先级排列一次

for(int j=ij<pc.lengthj++){

if(pc[i].privilege <pc[j].privilege){

temp = pc[i]

pc[i] = pc[j]

pc[j] = temp

}

}

}

}

}

}

class PCB {//声明进程类

int name,totaltime,runtime,privilege

boolean isNotFinish

public PCB(){

}

public PCB(int name, int totaltime, int privilege){

this.name = name//进程名

this.totaltime = totaltime//总时间

this.privilege = privilege//优先级别

this.runtime = 2//时间片,这里设值为2

this.isNotFinish = true//是否执行完毕

System.out.println("初始值: processname : " + name + " totaltime : " + totaltime + " privilege :" + privilege )

System.out.println()

}

public void run (MyQueue mq){//进程的基于时间片的执行算法

if(totaltime>1){

totaltime-=runtime//在总时间大于1的时候,总时间=总时间-时间片

privilege--

System.out.println(" processname : " + name + " remaintime : " + totaltime + " privilege :" + privilege )

}else if(totaltime==1){

totaltime--//在总时间为1时,执行时间为1

privilege--

System.out.println(" processname : " + name + " remaintime : " + totaltime + " privilege :" + privilege )

}else{

isNotFinish = false//总时间为0,将isNotFinish标记置为false

}

if(isNotFinish==true){

mq.deQueue()

mq.enQueue(this)

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12057732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存