Why Anylogic stopDelay() function throws error when Delay block is empty? - anylogic

I have an event with action
delay.stopDelay(delay.get(0));
it works fine but when the delay block gets empty error shows up
enter image description here

that's because your delay doesn't have any agent inside
so you need to do the following:
if(delay.size()>0){
delay.stopDelay(delay.get(0));
}

Related

AnyLogic - inheritance of properties in batch block

I want to store process times in my model for each agent of type Box. For this purpose I have created a Java class ProcessData.
My problem is that I always get NullPointerExceptions. I don't know if it's because of my code or the functionality of the batch block.
When the wait block reaches a certain size, all agents of type Box are routed to the batch block. The batch agent then waits in the seize block for staff member. If the agent is then seized, each agent of type Box contained in the batch agent should then get a start processing time. This is my code at enter of the delay block: box.getProcessData().add(new ProcessData(date(), duration()));. Using a constructor, I add the start time and duration as new variables to a new ProcessData entry.
To determine the end time of each Box agent I have the following code at unbatch block entry: box.getProcessData().getLast().setEnd(date());
Since I have a NullPointerException I can't tell exactly where it came from. My guess is that I have a bug with addressing the code: should I use agent. (from batch) or box. (name of original agent before batch)? Or is it not possible to give the batch agent properties that are inherited by the box agent?
First error is at unbatch, so the second code from above and second error is the following public void onExit( Box batch, Box agent ) { _unbatch_onExit_xjal( this, batch, agent ); }.
Following the screenshot of my error:
The problem you have with this model first,is that you are seizing a resource for the batch without releasing that resource... you need to release before unbatch
your error nevertheless is related to some code that you wrote in the on exit action of the unbatch block that you are unfortunately not telling us
But to discover what is null, check with a traceln() the value of the variables that are present in the on exit section of the unbatch in order to print on the screen what is null

Anylogic: StopDelay() is not working due to which agent is not able to leave the Delay block

StopDelay() is not working due to which agent is not able to leave the Delay3 block.
of course your stopDelay won't work because no agent ever reaches delay4
delay3 REQUIRES a call for stopDelay, but there's nothing doing that since the only time stopDelay is called, is further in the flow.
What you need to do instead is on the on enter action of the delay3:
if(delay4.size()==0){
delay3.stopDelay(agent);
}
and on the on exit of the delay4 you do:
if(delay3.size()>0){
delay3.stopDelay(delay3.get(0));
}

How to set agents hight in delay block?

By seizeTransporter block my AGV seizes an agent called "Sitz" and transports it via Move by Transporter block to a Delay Block.
When AGV enters the delay block the transported agent "Sitz" is changing its cargo location to 0.
I tried to fix that issue with creating an parameter on main called p_assemblyHight with default value 1.0 and the following code in Actions section of the delay Block: agent.setHight(p_assemblyHight, METER);
Anyway this action will not execute.
What can I do so that my transported product (called "Sitz") stays on the agv and not dropping in delay block?
Check the two screenshots for better understanding.
Thank you a lot!
The setHeight method does not change the z-component, but the height of an agent presentation. Irrelevant for you.
You need to access your Sitz in the delay block and change its z-component.
In the Delay block call:
agent.setXYZ(agent.getX(), agent.getY(), 10);
The last argument is the Z component, adjust as needed. The first 2 just make sure the XY components are not changed

How to display delay time of current agent in a delay block?

I would like to display in a text object the current delay time of a delay block. In the value editor of the text object I have sta1Delay.getDelayTime(agent) which throws an error "agent cannot be resolved to a variable".
You can do this:
In the "on enter" code box of your delay block, write myText.setText("Delay time: "+delayTime);
The keyword delayTime provides the duration for every new agent arriving.
Worth learning about those keywords, see https://www.benjamin-schumann.com/blog/2016/2/4/the-magic-lightbulb-and-how-it-can-help-your-anylogic-modelling

How to know any UI rendering is completed in automation code

I am wanting to know a button is rendered on main window UI or not. This button rendering is depending on server response result (written in Objective C). If server response comes perfectly it becomes render perfectly (VISIBLE) otherwise it is not present there (INVISIBLE). And whenever it becomes visible I always tap on it for further next process.
I wrote code
UIATarget.localTarget().pushTimeout(200);
//My code
UIATarget.localTarget().popTimeout();
By the above code I have to wait till 200 sec but my concern is I want to wait but whenever object is on screen I don't want keep me busy in WAITING MODE.
How will I write code in automation?
Thanks
Ok, this might give you idea how to follow-up:
For your view implement an accessibilityValue method which returns a JSON formatted value:
- (NSString *)accessibilityValue
{
return [NSString stringWithFormat:
#"{'MyButtonisVisible':%#}",
self.MyButton.isHidden ? #"false" : #"true"];
}
Then somehow you can access it from your test javascript:
var thisproperty = eval("(" + element.value() + ")");
if (thisproperty.MyButtonisVisible) {
UIATarget.localTarget().tap({"x":100, "y":100});
}
Hope that helps.
If you make the name different when you enable the button you can do this:
var awesomeButton = target.frontMostApp().mainWindow().buttons()[0];
UIATarget.localTarget().pushTimeout(200);
awesomeButton.withName("My Awesome Button");
if (awesomeButton.isVisible()) {
UIALogger.logError("Error no awesome button!");
}
UIATarget.localTarget().popTimeout();
withName will repeatedly test the name and control will return to your script once the name matches or when the time out is reached.
Per Apple's Doc
withName:
Tests if the name attribute of the element has the given string value. If the match fails, the test is retried until the current timeout expires.
Timeout Periods:
If the action completes during the timeout period, that line of code returns, and your script can proceed. If the action doesn’t complete during the timeout period, an exception is thrown.
https://developer.apple.com/library/etc/redirect/xcode/ios/e808aa/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UsingtheAutomationInstrument/UsingtheAutomationInstrument.html#//apple_ref/doc/uid/TP40004652-CH20