Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Encoder module

Papik
2021-03-01
2021-03-09
  • Papik

    Papik - 2021-03-01

    Hello everyone, I purchased the encoder module and the encoder itself. I am going to control the speed of the motor by setting the input value with an encoder, and the output signal will be 0-10 V(0-200 rpm), which will be applied to the input of the frequency converter. Encoder module WAGO 750-631 / 000-011 has a pulse counter that increments or decrements the value depending on the direction of rotation of the encoder. But I can't hard-code this counter because I can set the speed directly from the interface (absolute value). I need to somehow track only the change in the value on the counter for a certain amount of time (for example, 1 sec) and add this value to the value that is currently outputting.

    Example: I set the engine speed to 100(5 V out) rpm via the interface. On the counter (encoder module) the value (conditionally) 63 is set, I turned the encoder and increased the value by 120 rpm(6 V out), the value on the counter became 263, 1 pulse is equal to the change in revolutions by 0.1 rpm(0.005 V out). Then I again set 50 (2.5 V out) rpm through the interface, but since I am not tied to the output rigidly, the counter remained at 263 and then I want to add again, so I only need to track the change in the counter value per unit of time, please tell me how best to do it, with some blinks, timers or interrupts, so far nothing comes out for me.

     
  • TPTSys - 2021-03-07

    papik,

    some very basic psuedocode, but seems something like this should get you sorted. will need to watch for rollovers and call this at some relevant interval...

    timeNow:=Time();
    timeDelta:=timeNow - lastTime;
    counterDelta:=CounterVal - lastCounterVal;
    lastCounterVal:=CounterVal;
    lastTime:=timeNow;
    
     
    • Papik

      Papik - 2021-03-09

      Thank you for your answer
      So, I put this in one block and can I call this block with a blink, say once every 500 ms? And instead of CounterVal, there should be an address to the counter value at the moment?

       
      • aliazzz

        aliazzz - 2021-03-09

        Just run this solution in a separate task if you must (every x msec) and then write the value's into a global var list (GVL) from which you read in a slower / different task.

         
        πŸ‘
        1

Log in to post a comment.