• Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search

    Hydraulic Press project on Neuron M203 - beginner needs help

    Mervis
    5
    17
    1608
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      r3sist @Martin Kudláček last edited by

      Im back, got my hands on an used STS ATM/T 0-400bar, 0-10V output. Configured AI1.1 for voltage mode, plugged the sensor into air line, got some readings after the transformation on around 6,3-6,4bar so it seems correct.

      Now when i have the pressure value I should start coding the machine program itself.

      For first i would want and idle menu machine state, use some kind of case instruction to choose between the automatic and manual press mode where:
      In auto, some RO's would stay on until the before set pressure is met and until limit switches arent tripped.
      Where in manual, no more than 400bars and also to the min/max limit switch positions.

      Could you guys guide me or show some .st examples? I've no idea on how to start it right.

      Also is there a way to connect a simple display to neuron, and also program plc to output for example the A1.1 value?
      I know there is a full hmi panel available, but I would prefer something simple, + / - using DI's, and simple lcd/segment display for it, so an operator could adjust the set pressure for auto mode easily.

      1 Reply Last reply Reply Quote 0
      • J
        josar last edited by

        Hi @r3sist,
        any progress with your project? Very interesting.

        R 1 Reply Last reply Reply Quote 0
        • R
          r3sist @josar last edited by

          @josar Yes, we have a lot of leaking problems at the moment, but its almost finished. Still trying to figure out something more basic for HMI than a weintek panel. I will post the updates with some pictures soon, gonna take about 2 weeks I hope.

          1 Reply Last reply Reply Quote 0
          • R
            r3sist last edited by

            So we got most of the leaking solved, time came to code the auto cycle.
            While coding manal valve closing/openings on button presses was easy, this is where i began to struggle.
            I followed a guide which was based on a TwinCat 3, but obviously things are different between IDE's.
            What i would like to know is to how to properly init and call a simple timer and r_trig function block in mervis. Does it have to be manually added into the main.fbd, then called properly from main.st for example? Or can i just declare it in .st which would seem more convenient for me.

            VAR
            // timers
            fbStartautotimer:TON;
            // triggers
                fbAutoInit_RTRIG:R_TRIG;
                fbAutoOff_RTRIG:R_TRIG;
                fbCycle_RTRIG:R_TRIG;
                fbZeropos_RTRIG:R_TRIG;
            END_VAR
            

            Also im not sure if the code below will work even if I call the function blocks properly.

            // auto cycle
            
            // button mapping
            hw.$Neuron M203_DI2.10$:= bManualMode;
            hw.$Neuron M203_DI2.11$:= bAutoMode;
            hw.$Neuron M203_DI2.12$:= bAutoEjectorMode;
            // pressure setpoint and scaling
            iPressure:= REAL_TO_INT(hw.$Neuron M203_AI1.01$);
            iPressure_setpoint:= 200;
            fbAutoInit_RTRIG(clk:=bAutoCycleOn);
            fbAutoOff_RTRIG(clk:=bAutoCycleOff);
            
            IF bAutoMode & fbAutoInit_RTRIG.Q AND NOT fbAutoOff_RTRIG.Q THEN
                bPumpOn:= TRUE;
                iState:= 10;
            ELSE
                bPumpOff:= TRUE;    
                iState:= 0;
            END_IF;
            CASE iState OF 
                10:
                // timer init to let the pump run well
                fbStartautotimer(IN:bPumpOn,PT:T#2s);
                IF fbStartautotimer.Q THEN
                    fbStartautotimer(IN:=FALSE);
                END_IF;
                fbCycle_RTRIG(clk:=fbStartautotimer.Q);
                IF fbCycletrigger_RTRIG.Q THEN
                iState:= 20;
                sCurrentCycleState:= "Pressing cycle start";
                END_IF;
                20:
                IF iPressure <= iPressure_setpoint AND NOT bLimitswitch2 & fbAutoOff_RTRIG.Q THEN
                bTableDown_valve:= TRUE;
                sCurrentCycleState:= "Pressing to the pressure setpoint";
                iState:= 30;
                ELSE
                bTableDown_valve:= FALSE;
                sCurrentCycleState:= "Cycle stopped, reset";
                END_IF;
                30:
                // expression cycle completed, move the table upwards to 0 position
                fbZeropos_RTRIG(clk:=iState:=30);
                IF fbZeropos_RTRIG.Q AND NOT bLimitswitch3 & fbAutoOff_RTRIG.Q THEN
                bTableUp_valve:= TRUE;
                iTotalAutoCycles:= iTotalAutoCycles +1;
                sCurrentCycleState:= "Zeroing table, cycle end";
                END_IF;
            END_CASE;
            

            I would appreciate a helping hand on this one.

            Also wondering if this: https://www.waveshare.com/wiki/3.5inch_HDMI_LCD

            can be hooked up to display the pressure? And assign some leftover DI's for +/- ?

            1 Reply Last reply Reply Quote 0
            • T
              tomas_hora administrators last edited by

              If you want to call a function(or FB) in a ST, you can create aditional program in ST and call the FB from there.

              The display however is a HDMI and cannot be hooked to any DIs.

              1 Reply Last reply Reply Quote 0
              • J
                jaroslav_sobota last edited by

                I guess that @r3sist was trying to cover two separate topics:

                • using the 3.5" screen as local HMI (or operator screen, depending on the preferred terminology)
                • using DIs to manipulate some variable(s) in the algorithm, e.g. maximum and minimum for pressure

                Am I right?

                Jaroslav

                R 1 Reply Last reply Reply Quote 0
                • R
                  r3sist @jaroslav_sobota last edited by

                  @jaroslav_sobota
                  Yes exactly. I just need anything to notify the operator directly on the machine about current pressure , and let him adjust this one pressure setpoint variable. It could even be a segment lcd.

                  T J 2 Replies Last reply Reply Quote 0
                  • T
                    tomas_hora administrators @r3sist last edited by

                    @r3sist thanks for clarification.

                    The best would be to setup a HMI terminal like this one https://www.unipi.technology/weintek-mt8051ip-p198?categoryId=29

                    Hooking buttons to DIs would be OK, but you would have to figure out the display since Neuron do not have native support for HDMI or I2C displays.

                    1 Reply Last reply Reply Quote 0
                    • J
                      jaroslav_sobota @r3sist last edited by

                      @r3sist said in Hydraulic Press project on Neuron M203 - beginner needs help:

                      I just need anything to notify the operator directly on the machine about current pressure , and let him adjust this one pressure setpoint variable. It could even be a segment lcd.

                      If segment LCD is all you need, maybe something like this could do the trick:
                      https://en.papouch.com/tds-rs485-7-segment-led-display-p1922/

                      You can connect it via RS485 and communicate using Modbus RTU.

                      R 1 Reply Last reply Reply Quote 0
                      • R
                        r3sist @jaroslav_sobota last edited by

                        @jaroslav_sobota said in Hydraulic Press project on Neuron M203 - beginner needs help:

                        If segment LCD is all you need, maybe something like this could do the trick:
                        https://en.papouch.com/tds-rs485-7-segment-led-display-p1922/

                        You can connect it via RS485 and communicate using Modbus RTU.

                        Oh, thanks, I was totally unaware of displays over RS485. Yes, this should work.
                        Going to look for a suitable device then, and post updates here.

                        1 Reply Last reply Reply Quote 0
                        • R
                          r3sist last edited by r3sist

                          I finally convinced my boss, and we went with Weintek MT8051iP.
                          Unfortunately i am not able to make any progress with automatic work cycle other than getting function blocks to work at last. Although nothing happens when i press fbAutoCycleOn.

                          Also i wanted to make things easier for me and tried to rename generated variable names for Neuron I/O, but i think the way I did it is completely wrong as I've ran into random troubles.
                          At first i tried something like this :

                          hw.$Neuron M203_RO_2.01_w$:= bPumpOn;
                          

                          But it didnt work, neither for RO or DI's.

                          iPressure:= REAL_TO_INT(hw.$Neuron M203_AI_1.01$);
                          iPressure_setpoint:=200;
                          IF iPressure >= iPressure_setpoint THEN
                          xPressureReached:= TRUE;
                          ELSE
                          xPressureReached:= FALSE;
                          END_IF;
                          
                          (*// relay outputs binding
                          
                          // down valve
                          IF bTableDown_valve THEN
                          hw.$Neuron M203_RO_2.01_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.01_w$:= FALSE;
                          END_IF;
                          // up valve
                          IF bTableUp_valve THEN
                          hw.$Neuron M203_RO_2.02_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.02_w$:= FALSE;
                          END_IF;
                          // bot down valve
                          IF bBottomTableDown_valve THEN
                          hw.$Neuron M203_RO_2.03_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.03_w$:= FALSE;
                          END_IF;
                          // bot up valve
                          IF bBottomTableUp_valve THEN
                          hw.$Neuron M203_RO_2.04_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.04_w$:= FALSE;
                          END_IF;
                          // high pressure
                          IF bHighPressure_valve THEN
                          hw.$Neuron M203_RO_2.05_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.05_w$:= FALSE;
                          END_IF;
                          // pump 
                          IF bPumpOn THEN
                          hw.$Neuron M203_RO_2.06_w$:= TRUE;
                          ELSE
                          hw.$Neuron M203_RO_2.06_w$:= FALSE;
                          END_IF;
                          
                          // input assignment
                          
                          // manual
                          IF hw.$Neuron M203_DI_2.10$ THEN
                          bManualMode:= TRUE;
                          ELSE
                          bManualMode:= FALSE;
                          END_IF;
                          // auto
                          IF hw.$Neuron M203_DI_2.11$ THEN
                          bAutoMode:= TRUE;
                          ELSE
                          bAutoMode:= FALSE;
                          END_IF;
                          // autoeject
                          IF hw.$Neuron M203_DI_2.12$ THEN
                          bAutoEjectorMode:= TRUE;
                          ELSE
                          bAutoEjectorMode:= FALSE;
                          END_IF;
                          // Limit up
                          IF hw.$Neuron M203_DI_1.01$ THEN
                          bLimitTableZero:= TRUE;
                          ELSE
                          bLimitTableZero:= FALSE;
                          END_IF;
                          // Limit bot up
                          IF hw.$Neuron M203_DI_1.02$ THEN
                          bLimitBottomTableUp:= TRUE;
                          ELSE
                          bLimitBottomTableUp:= FALSE;
                          END_IF;
                          // Limit bot down
                          IF hw.$Neuron M203_DI_1.03$ THEN
                          bLimitBottomTableDown:= TRUE;
                          ELSE
                          bLimitBottomTableDown:= FALSE;
                          END_IF;
                          // Pump on
                          IF hw.$Neuron M203_DI_2.01$ THEN
                          bPumpOn_button:= TRUE;
                          ELSE
                          bPumpOn_button:= FALSE;
                          END_IF;
                          // Pump off
                          IF hw.$Neuron M203_DI_2.02$ THEN
                          bPumpOff_button:= TRUE;
                          ELSE
                          bPumpOff_button:= FALSE;
                          END_IF;
                          // Table down
                          IF hw.$Neuron M203_DI_2.03$ THEN
                          bTableDown_button:= TRUE;
                          ELSE
                          bTableDown_button:= FALSE;
                          bTableDown_valve:= FALSE;
                          END_IF;
                          // Table up
                          IF hw.$Neuron M203_DI_2.04$ THEN
                          bTableUp_button:= TRUE;
                          ELSE
                          bTableUp_button:= FALSE;
                          bTableUp_valve:= FALSE;
                          END_IF;
                          // Bot table up
                          IF hw.$Neuron M203_DI_2.05$ THEN
                          bBottomTableUp_button:= TRUE;
                          ELSE
                          bBottomTableUp_button:= FALSE;
                          END_IF;
                          // Bot table down
                          IF hw.$Neuron M203_DI_2.06$ THEN
                          bBottomTableDown_button:= TRUE;
                          ELSE
                          bBottomTableDown_button:= FALSE;
                          END_IF;
                          // Auto on
                          IF hw.$Neuron M203_DI_2.07$ THEN
                          bAutoCycleOn:= TRUE;
                          ELSE
                          bAutoCycleOn:= FALSE;
                          END_IF;
                          // Auto off
                          IF hw.$Neuron M203_DI_2.08$ THEN
                          bAutoCycleOff:= TRUE;
                          ELSE
                          bAutoCycleOff:= FALSE;
                          END_IF;
                          // Zero
                          IF hw.$Neuron M203_DI_2.09$ THEN
                          bZeroTable_button:= TRUE;
                          ELSE
                          bZeroTable_button:= FALSE;
                          END_IF;
                          

                          So right after this I have these IF's :

                          // table up
                          
                          IF bTableUp_button = TRUE AND NOT bLimitTableZero THEN
                          bTableUp_valve:=TRUE;
                          ELSE
                          bTableUp_valve:=FALSE;
                          END_IF;
                          
                          // table down
                          
                          IF bTableDown_button = TRUE AND NOT xPressureReached THEN
                          bTableDown_valve:=TRUE;
                          ELSE
                          bTableDown_valve:=FALSE;
                          END_IF;
                          
                          // ejector down
                          
                          IF bBottomTableDown_button = TRUE &
                          bLimitBottomTableDown = FALSE &
                          bManualMode = TRUE THEN
                          bBottomTableDown_valve:=TRUE;
                          ELSE
                          bBottomTableDown_valve:= FALSE;
                          END_IF;
                          
                          // ejector up
                          
                          IF bBottomTableUp_button = TRUE &
                          bLimitBottomTableUp = FALSE & 
                          bManualMode = TRUE THEN
                          bBottomTableUp_valve:=TRUE;
                          ELSE
                          bBottomTableUp_valve:=FALSE;
                          END_IF;
                          

                          ///

                          fbAutoInit_RTRIG(CLK:=bAutoCycleOn);
                          fbAutoOff_RTRIG(CLK:=bAutoCycleOff);
                          
                          IF  fbAutoInit_RTRIG.Q THEN
                              xPumpStart:= TRUE;
                              iState:= 10;
                          ELSE
                              xPumpStart:= FALSE;    
                          END_IF;
                          
                          CASE iState OF 
                              10:
                              // timer init to let the pump run well
                              fbStartautotimer(IN:=xPumpStart,PT:=iPumpTimeDelay);
                              IF fbStartautotimer.Q THEN
                                  fbStartautotimer(IN:=FALSE);
                              END_IF;
                              fbCycle_RTRIG(clk:=fbStartautotimer.Q);
                              IF fbCycle_RTRIG.Q THEN
                              sCurrentCycleState:= "Pressing cycle start";
                              END_IF;
                              IF bLimitTableZero = FALSE THEN
                              bTableUp_valve:= TRUE;
                              END_IF;
                              iState:= 20;
                              20:
                              IF iPressure <= iPressure_setpoint AND NOT fbAutoOff_RTRIG.Q AND bLimitBottomTableDown THEN
                              bTableDown_valve:= TRUE;
                              sCurrentCycleState:= "Pressing to the pressure setpoint";
                              xAutoZeroPos:= TRUE;
                              ELSE
                              bTableDown_valve:= FALSE;
                              sCurrentCycleState:= "Cycle stopped, reset";
                              END_IF;
                              iState:= 30;
                              30:
                              // expression cycle completed, move the table upwards to 0 position
                              fbZeropos_RTRIG(clk:=xAutoZeroPos);
                              IF fbZeropos_RTRIG.Q AND NOT bLimitTableZero & fbAutoOff_RTRIG.Q THEN
                              bTableUp_valve:= TRUE;
                              iTotalAutoCycles:= iTotalAutoCycles +1;
                              sCurrentCycleState:= "Zeroing table, cycle end";
                              END_IF;
                          END_CASE;
                          

                          And im totally clueless about what's wrong. I also should point out that i have all that code in one main .st file. Should i divide functions for manual operation and automatic cycle into another .st? Set individual tasks for them?

                          Any help or tips on this would be very appreciated. Im basically out of ideas and my knowledge on PLC programming is narrow.

                          Oh of course Mervis shows no errors. I can upload the project if someone is willing to take a look.

                          Martin Kudláček 1 Reply Last reply Reply Quote 0
                          • Martin Kudláček
                            Martin Kudláček administrators @r3sist last edited by

                            Hi @r3sist,
                            the:

                            IF bPumpOn THEN
                            hw.$Neuron M203_RO_2.06_w$:= TRUE;
                            ELSE
                            hw.$Neuron M203_RO_2.06_w$:= FALSE;
                            END_IF;
                            

                            is exactly the same as this:

                            hw.$Neuron M203_RO_2.06_w$:= bPumpOn;
                            

                            If there is no syntactic error, which would be detected upon MervisIDE Build, then there is error in the program itself. Try uploading it here or sending it to support@unipi.technology. Please, include a VERY detailed description of the real process, not the itself program. It will help find the real issue.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post