Skocz do zawartości

Odczyt dwóch wartości z funkcji


Pomocna odpowiedź

Napisano
int updateRelay() {
  
  // read the current value of the coil
  int coilValue1 =! modbusTCPServer.coilRead(0);
  int motor_kierunek_M = modbusTCPServer.coilRead(1);

  int coilValue3 = modbusTCPServer.coilRead(2);
  int coilValue4 = modbusTCPServer.coilRead(3);
  
 return coilValue1;

W jaki sposób wyprowadzić i odczytać z funkcji dwie zmienne coilValue1 i motor_kierunek_M

Jedną odczytuję updateRelay()

Pozdrawiam !

(edytowany)

Zbudować strukturę z wartościami i pobierać wartości przez wskaźnik do niej lub zwracać w return. Metoda 1) jest lepsza ponieważ możesz wykorzystać return do sprawdzenia czy transmisja nie zwróciła błędów 

typedef struct{
  int val[2];
}modbus_value_t;  

int updateRelay(modbus_value_t * v)
{
    v->val[0] = 20;
    v->val[1] = 30;
    return 0; // 0 -> dane OK
}    
    
int main() {

modbus_value_t modval;
updateRelay(&modval);
    
    printf("%d %d", modval.val[0], modval.val[1]);
}

Właściwie to mógłbyś jako argument funkcji podać tablicę, ale struktura pozwala na więcej niż tylko jeden określony typ danych. 

Edytowano przez _LM_
  • Lubię! 3
  • Nie zgadzam się! 1
int updateRelay() {
  
  int wynik[2];
  
  // read the current value of the coil
  int SET_PIN_krok_M =! modbusTCPServer.coilRead(0);//KROK
  int motor_kierunek_M = modbusTCPServer.coilRead(1);//KIERUNEK P/L

  int coilValue3 = modbusTCPServer.coilRead(2);
  int coilValue4 = modbusTCPServer.coilRead(3);
  
  	wynik[0]=SET_PIN_krok_M;
	wynik[1]=motor_kierunek_M;

 return wynik;
}

myślałem i czym takim tylko niewidem jak się odwołać do wartości poszczególnej zmiennej

updateRelay() ????

 

Daj w argumencie funkcji wskaźnik do tablicy wynik. Budowanie tablic wewnątrz funkcji to nie jest dobry pomysł.

25 minut temu, _LM_ napisał:

Daj w argumencie funkcji wskaźnik do tablicy wynik. Budowanie tablic wewnątrz funkcji to nie jest dobry pomysł.

ok A możesz napisać mi kawałek kodu z Twojego rozwiązania ?>

Dziękuje i pozdrawiam !

No masz przecież wyżej w edytowanym poście. Podmień tylko zmienne na swoje potrzeby, return zostaw jako sprawdzenie czy dane są prawidłowe coś w stylu
 

return modbus_check_crc(); 0 = OK other = fail

 

ok dziękuję za pomoc !!

szukam jeszcze jakiejś funkcji, która wygeneruje impuls prostokątny o określonym czasie trwania 

na wejściu zmiana stanu val1 (zbocze narastające) na wyjściu prostokąt czas trwania 300 ms

pozdrawiam !

  • Lubię! 1
3 minuty temu, robo1973 napisał:

szukam jeszcze jakiejś funkcji, która wygeneruje impuls prostokątny o określonym czasie trwania 

Jakiego mikrokontolera używasz? 

 

4 minuty temu, robo1973 napisał:

na wejściu zmiana stanu val1 (zbocze narastające) na wyjściu prostokąt czas trwania 300 ms

Ten prostokąt to ma być pojedynczy "strzał" czy coś w rodzaju PWM o zadanej częstotliwości?

pod Arduino

prostokąt pojedynczy strzał

Za każdym razem jak nastąpi zmiana stanu na wejściu val1 (zbocze narastające) będzie generowany jeden przebieg prostokątny

@robo1973 tu masz taki przyklad z micros()...moze byc koniecznosc dodania filtru dla drgania stykow jesli to ma byc guzik 

const byte ledPin = 13;
const byte interruptPin = 2;
bool flaga;
uint32_t last;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}

void loop() {
  if (micros() - last > 300000UL && flaga) {
    digitalWrite(ledPin, LOW);
    flaga = 0;
  }
}

void blink() {
  digitalWrite(ledPin, HIGH);
  flaga = 1;
  last = micros();
}

 

myślałem o przewiewniach ale one działają chyba tylko dla fizycznych portów

Ja chcę użyć zmiany stanu zmiennej

int SET_PIN_krok_M = !modbusTCPServer.coilRead(0);

@robo1973 to jesli nie ma przerwania, to widze to tak mniej wiecej...

const byte ledPin = 13;
const byte interruptPin = 2;
bool flaga;
uint32_t last;

void setup() {
  pinMode(ledPin, OUTPUT);
 
}

void loop() {
  int SET_PIN_krok_M = !modbusTCPServer.coilRead(0);
  if (SET_PIN_krok_M) {
    flaga = 1;
    last = micros();
    digitalWrite(ledPin, HIGH);
  }
  if (micros() - last > 300000UL && flaga) {
    digitalWrite(ledPin, LOW);
    flaga = 0;
  }
}

 

(edytowany)
void loop() {
  // put your main code here, to run repeatedly:

}

{
  
  int skok_Modbus;
  int Modbus_State;

  int SET_PIN_krok_M = !modbusTCPServer.coilRead(0);//KROK 0 start 1 stop 
  int motor_kierunek_M = modbusTCPServer.coilRead(1);//KIERUNEK P/L

  int coilValue3 = modbusTCPServer.coilRead(2);
  int coilValue4 = modbusTCPServer.coilRead(3);

  if (SET_PIN_krok_M == LOW && Modbus_State == LOW) { //SET
    Modbus_State = HIGH;

    skok_Modbus = 0;
    delay (300);
    skok_Modbus = 1;
    delay(300);
    //Serial.println("ON");
      
  }
      
  else if (SET_PIN_krok_M == HIGH  &&  Modbus_State == HIGH) {//RESET
   Modbus_State = LOW;
   skok_Modbus = 1;
   // Serial.println("OFF");
    
  }

  Serial.print("Cewka 1 SET"); Serial.println(skok_Modbus);
  delay(10);
  //v->val[0] = SET_PIN_krok_M;
  v->val[0] = skok_Modbus;
  v->val[1] = motor_kierunek_M;

  return 0; // 0 -> dane OK

 

Generalnie kod powyżej by zadziałał tylko

   skok_Modbus = 0;
    delay (300);
    skok_Modbus = 1;
    delay(300);

Czy nie wiem jak za pomocą funkcji, (inaczej ) wygenerować przebieg prostokątny 0 (300ms)  > 1 (300ms) dla sygnału skok_Modbus

pozdrawiam i dzięki za pomoc !!

Edytowano przez robo1973

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...