Skocz do zawartości

Odczyt dwóch wartości z funkcji


robo1973

Pomocna odpowiedź

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 !

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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() ????

 

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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 !

Link do komentarza
Share on other sites

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

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

@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();
}

 

Link do komentarza
Share on other sites

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);

Link do komentarza
Share on other sites

@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;
  }
}

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.