Feeder Signal programming

Hello
Im looking to create different components depending on what signal i set in the feeder.
Currently im looking at the shape feeder.
Say that i have two signals
CreateSignal1 - when set high creates a ball
CreateSignal2 - when set high creates a barrel

how do i code this in the script?

//David

Your signals should be connected to your Pythonscript. Click on them and in Connections put your Script in there.

You should also have two ComponentCreator that create the ball and the barrel.

In the Script:
comp = getComponent()
creator1 = comp.findBehaviour('ComponentCreator1')
creator2 = comp.findBehaviour('ComponentCreator2')

def OnSignal(signal):
   if signal.Name == 'CreateSignal1' and signal.Value:
      creator1.create()
   elif signal.Name == 'CreateSignal2' and signal.Value:
      creator2.create()

Hello Again
I tried to apply your code to a basic feeder but i feel that something is missing to handle if i switch signals. As it is now, i can only create one of the parts on a given signal. What am i missing?

Try_1.vcmx (38.7 KB)

Yeah sorry, forgot to mention this. There can only be one connection between input and output of behaviours so we need to also connect the chosen creator to the path before we create.

creator1 = comp.findBehaviour('ComponentCreator_1')
creator1_out = creator1.getConnector('Output')
creator2 = comp.findBehaviour('ComponentCreator_2')
creator2_out = creator2.getConnector('Output')
path_in = comp.findBehaviour('OutPath').getConnector('Input')

def OnSignal(signal):
   if signal.Name == 'CreateSignal1' and signal.Value:
      creator1_out.connect(path_in)
      creator1.create()
   elif signal.Name == 'CreateSignal2' and signal.Value:
      creator2_out.connect(path_in)
      creator2.create()
1 Like

Ahh, works fine. there is one problem when connecting an external signal source via OPCUA.
When toggling between signals, the creator lags a bit before switching. To avoid this i would like to add the functionality to only create a new part on the rising edge of the in signal.
I have studied the Shape-feeder script and it seems to have the functionality that i need.
I tried to impliment the code thus far into that script instead but there where no parts created.

In the while-loop of the script i copied and modified the code like this in its own if-statement:

if comp.CreateOnlyOnSignal:
      triggerCondition(lambda: getTrigger() == createSignal_1 and createSignal_1.Value)
    # try to create a part
    part = creator1.create()
    # if part creation is succesful (e.g. conveyor not blocked)
    if part:
      m = poseProp.Value
      if offsetEnabled.Value:
        m.translateRel(0,randomOffset.Value,0)
      if turnEnabled.Value:
        m.rotateRelZ(randomTurn.Value)
      part.MovementOrigin = m
      if comp.StationaryCreator:
        delay(0)
        part.stopMovement()
        triggerCondition(lambda: getTrigger() == transSignal and not transSignal.Value)
    else:
      msg("Component creation failed. Output blocked?")
    

    if not comp.CreateOnlyOnSignal:
      # Delay and check that interval is not zero
      delay(max(comp.CreationInterval, .0000001) )

But there where no components showing up unfortunately, Try_2.vcmx (56.4 KB)

Hey, I looked at your first example again (try1) and the reason for the lag was because the ComponentCreator had the CreateSignal set as Transitionsignal. The problem with this is everytime a Component is created the Transitionsignal, which in this case is CreateSignal, will become True and once the Component is out it will become False again.

If you need this information then you should use another signal. The CreateSignals should only be used to signal the creation of components.

The component is already only being created on the rising edge of the signal in the first example.
The OnSignal event is called everytime the value switches between True and False. That’s why we have the second condition in the if statement: and signal.Value. This checks if the signal is True and only then does it create the component.

You can also change the signal to False again after creating the component. That way you don’t have to change the signal twice.

creator.create() 
signal.Value = False

Ahh perfect, now it works when switching the signals.
Got one final issue,but i solved it but i might just as well tell for reference.
When first changing the singal from a server, the solution generated two item of the same type.
This is due to that the update mode is set to cyclic. You need to change this to event-based in order to generate one item on each rising edge.
This is done in the connectivitytab->server->server to simulation and on the properties panel you can change the updatemode.
Thanks for the help barismungan !
Much appreciated
//David

Hello there,

I want to stop the feeder if there’s enough product on the conveyor and start the feeder if there is lack of product on the conveyor (in general feeder don’t produce product if the conveyor is full), how can i extract the time from here (how much time the feeder has run and which time there was a lack of product on the conveyor )

I though it’s a question related to feeder, that’s why i asked here!

Any answer or idea would be appreciated!!
Thanks

Hey Machete,

From the help file → vcStatistics → ComponentMaxTime
Is this what you are looking for?

You can get the simulation total time with:
sim = getSimulation()
total_time = sim.SimTime

I think not!
ComponentMaxTime: Gets the maximum amount of time a component spent contained in a component.

I want a stream of data for each component spending in a process:
for example: a component passed a conveyor with a sensor: when it triggered the sensor
then it goes to a milling machine: how much time it was there in the milling machine
the it goes to a outlet conveyor with a sensor: when it triggered the sensor

in a sense: I want a time series data for each component, sensor
being a novice, i had to ask this question:
should i write this in python script ?
sim = getSimulation()
total_time = sim.SimTime

I meant where should i initiate the code for getting the whole simulation time ?

Thanks!

HI
I need small help in scripting.
1.i used basic feeder with the script shown above. But initially while playing sim its creating parts without any signal
2. when i gave signal feeder stops creating parts and its producing product according to signal.

i have 11 parts. so i created 11 signals as shown below.
Conveyor_Merging_DOUBT.vcmx (1.7 MB)

image