Wie kan me het duwtje in de juiste richting geven

IDE gerelateerde berichten
Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor shooter » 05 Feb 2016, 00:32

een hulprelais bedoel je een merker mee?
boolean hulprelais
boolean merker
dan is if (analog.....){hulprelais=true}else{hulprelais=false}
merker = (hulprelais || merker) && !stop;
bijvoorbeeld.
er is verschil tussen boolean, HIGH, en int etc.
dus als je een status van een input wilt kun je dat in plclib doen met input1=in(X0), maar, als het geen input is dan moet je natuurlijk geen digitalRead gebruiken.
In een PLC worden de ingangen voor de cyclus eerst in een stuk geheugen gezet, dat is in plclib anders,
in(X0) betekent gewoon scanValue=digitalRead(10). (of welke pin je in de setup hebt opgegeven.
een hulprelais heeft geen pinnummer (het is immers geen ingang.) en dus kun je die niet opvragen met digitalRead,
hulprelais is de TAGNAME net als X0 een tagname is.

om in S5 te blijven mag je een array maken Merker[]=0,0,0,0,0,0, omdat plclib met INT werkt. vreemd maar ach het is maar een amateur library.

en dan bijvoorbeeld
#define hulprelais 2
.....
en dan kun je Merker [hulprelais]=scanValue dan staat het resultaat naar een merker.
paul deelen
shooter@home.nl

Advertisement

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor FPCUser » 05 Feb 2016, 11:22

in(X0) betekent gewoon scanValue=digitalRead(10).


Gedeeltelijk waar:

In plclib zijn een aantal fucties minimaal twee keer gedefinieerd.
Maar dan met verschillende argumenten.
Dit noemt men dan overloaded functions.

Dit is niet toegestaan in 'C', maar wel in 'C++'.
Omdat bij het compileren gebruik gemaakt wordt van de aangepaste Gnu C++ compiler werkt dit.
Ook diverse bijgeleverde library's maken hier gebruik van.

Terug naar de functie in().
Eenmaal gedefinieerd met een int voor gebruik met een pinnummer, en eenmaal gedefinieerd met een unsigned int voor een variabele of te wel merker.
Daarom is het ook belangrijk dat variabelen (merkers) als unsigned int worden gedefinieerd, anders kan de compiler niet 'zien' welke functie gebruikt moet worden.

cpp code
// Read an input pin (pin number supplied as integer)
unsigned int in(int input) {
scanValue = digitalRead(input);
return(scanValue);
}


cpp code
// Read an auxiliary input (variable supplied as unsigned integer)
unsigned int in(unsigned int input) {
scanValue = input;
return(scanValue);
}


Conclusie: je kan wel degelijk een merker als 'ingang' gebruiken.

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor FPCUser » 05 Feb 2016, 14:43

Hierbij een voorbeeld waarbij merkers gebruikt worden om een resultaat in weg te schrijven, out() en later opnieuw in te lezen, in().

cpp code
/*
* Een voorbeeld met merkers in een ladderdiagram.
*
* Y0 = (X0 of X1) en (X2 of X3)
*
* | X0 X2 Y0 |
* +---[ ]---+----+---{ ]----+--( )---+
* | + + + |
* | X1 + + X3 + |
* +---[ ]---+ + ---{ }---+ |
* | |
*
* Dit wordt dan:
*
* | X0 M0 |
* +---[ ]---+-----------------( )---+
* | | |
* | X1 | |
* +---[ ]---+ |
* | |
* | X2 M1 |
* +---[ ]---+-----------------( )---+
* | | |
* | X3 | |
* |---[ ]---+ |
* | |
* | M0 M1 Y0 |
* +---[ ]-------[ ]-----------( )---+
* | |
*
*/

#include <plcLib.h>

unsigned int M0, M1; // 2 merkers

void setup() {
setupPLC();
}

void loop() {
in(X0);
orBit(X1);
out(M0); // resultaat eerste of in merker M0

in(X2);
orBit(X3);
out(M1); // resultaat tweede of in merker M1

in(M0);
andBit(M1);
out(Y0); // uitgang is resultaat van M0 en M1
}

Berichten: 20
Geregistreerd: 25 Apr 2015, 15:18

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor Norbert » 05 Feb 2016, 15:16

bedankt weer
Dit is wel plc liB
Hoe heb e het er zo grafisch ingekregen ..getyped?
Als ik hetzelfde doe in de arduiocode (ccp code?) dan werkt het bij mij niet.
Wat doe ik dan fout?

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor FPCUser » 05 Feb 2016, 15:45

Wat je 'fout' doet weet ik niet ;)

Ik type de ASCII codes normaal in bij het maken van het programma in de Arduino IDE.
Daarna is het copieeren en plakken tussen de code2=cpp /code2 haken op de site.
In het berichtenvenster ziet het er niet uit, maar als je dan op de toets Voorbeeld klikt, wordt het wel goed uitgelijnd.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor shooter » 05 Feb 2016, 21:31

Tjonge zeg ik heb behoorlijk moeten zoeken met al die dubbele of zelfs quadro functies maar FPC heeft groot gelijk.
ik zou booleans verwachten, maar dat doet plclib dus helemaal niet.

wat wel werkt is:

zet boven je setup:

unsigned int M0;
unsigned int M1;
unsigned int M2;
unsigned int M3;

er wordt dus verschil gemaakt tussen een unsigned en een int.
heel vreemd (sommige functies worden wel 4 keer gedaan in de cpp, maar het werkt wel.
fpcuser heeft dus groot gelijk. bij mij werkte het ook wel, maar bij norbert dus niet.
en norbert dat grafische werkt ook niet hoor dat is alleen maar ter illsustratie.
paul deelen
shooter@home.nl

Berichten: 20
Geregistreerd: 25 Apr 2015, 15:18

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor Norbert » 05 Feb 2016, 21:57

En als je een merker wil gebruiken. Gewoon in arduino taal?.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor shooter » 06 Feb 2016, 11:28

de merkers zijn gewoon arduino taal.
je zult moeten kiezen tussen plclib of gewoon arduino. dat heeft te maken met het soort variabelen.
als je plclib gebruikt zet dan de merker als unsigned int neer.
je kunt ze natuurlijk altijd opvragen merker = boolean(M0);
schrijven kan direct ofwel M0=merker
plclib ziet wat het moet doen met een variabele.

je moet even in de gaten houden dat een merker ook een getal kan bevatten, dus je kunt situaties hebben dat je in een merker bijvoorbeeld een setpoint hebt staan.
als de merker 0 is dan is de uitkomst false anders is het true.
dus wat wil je verder nog weten.
paul deelen
shooter@home.nl

Berichten: 20
Geregistreerd: 25 Apr 2015, 15:18

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor Norbert » 07 Feb 2016, 00:49

Hallo Paul, Ik ga helemaal met je mee....maar het werkt niet dus heb ik mijn sketch er maar even bij gezet.
Met een eenvoudige test sketch werkte het ook niet, ik bekeek met de serieele monitor de status van dat bitje maar dat bleef 0.
Toen de serieele monitor eruit gepoetst wat werkte de merker wel.
Alleen ben ik nu een sketch aan het maken waar ik een 1602 display gebruik dus ook de serieele monitor, dus dan werken de merkers weer niet.
Dus merkers werken alleen als je iets met de serieele monitor doet gaat het fout.
Ik heb de sketch er maar even onder gezet.

cpp code
#include<LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int relais1 = 10;
int relais2 = 11; // the number of the LED pin
int relais3 = 12;
bool merker1;
boolean merker2;
bool merker3;
unsigned int spanning_bovengrens = 272; // 14 Volt= 280
unsigned int spanning_ondergrens = 220; // 11 Volt= 197
unsigned int spanning_startgrens = 240; // 12 Volt= 224
unsigned int spanning_stopgrens = 230; // 12 Volt= 224
unsigned long Timer1;
unsigned long Timer2;

float input_voltage = 0.0;
float temp = 0.0;
float r1 = 100000.0;
float r2 = 10060.0;

void setup()
{

pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT);
pinMode(relais3, OUTPUT);
pinMode(merker1, OUTPUT);
pinMode(merker2, OUTPUT);
pinMode(merker3, OUTPUT);


Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
lcd.begin(16, 2); //// set up the LCD's number of columns and rows:
lcd.print("ACCU VOLTMETER");
}
void loop() {
//Conversion formula for voltage
int analog_value = analogRead(A0);
temp = (analog_value * 5.0) / 1024.0;
input_voltage = temp / (r2 / (r1 + r2));

if (input_voltage < 0.1)
{
input_voltage = 0.0;
}
Serial.print("v= ");
Serial.println(input_voltage);
Serial.print ("analog_value = ");
Serial.println (analog_value);
lcd.setCursor(0, 1);
lcd.print("Spanning=");
lcd.print(input_voltage);
delay(300);

{
if (analog_value < spanning_startgrens) {
digitalWrite(relais2, HIGH);
digitalWrite(relais3, HIGH);
Timer1 = millis();

} else {
digitalWrite(relais2, LOW);
}

if (millis() - Timer1 >= 2000 ) {
digitalWrite(relais3, LOW);
}

if (analog_value > spanning_bovengrens) {
digitalWrite(merker1, HIGH );
} else {
digitalWrite(merker1, LOW);

//if (millis() - Timer2 >= 7000 ) {
//digitalWrite(relais1, LOW);
}
{
if (merker1 == HIGH)
digitalWrite(relais1, HIGH);
else
digitalWrite(relais1, LOW);
}
}
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Wie kan me het duwtje in de juiste richting geven

Berichtdoor nicoverduin » 07 Feb 2016, 10:30

Ik zou wat zorgvuldiger omgaan met de plaatsing van de accolades. Dat maakt je code een stuk overzichtelijker.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

VorigeVolgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 16 gasten