Projekt Stor-Erik, renovering av ångbogserbåt

Berätta om dina pågående projekt.
danei
EF Sponsor
Inlägg: 26335
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av danei »

Hur går det med värmeväxlaren om det är väldigt kallt vatten? Finns det inte risk att den fryser?
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Jo. Man får lösa det med ordentligt flöde. Och ett styr- och övervakningssystem som stänger av värmepumpen om det håller på att gå åt helvete. Därav att jag bygger det jag nu håller på att bygga.
MiaM
Inlägg: 9912
Blev medlem: 6 maj 2009, 22:19:19

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av MiaM »

Sidospår: Är det bara för mig som AliExpress-länken ändras till att visa sidan på ryska när jag klickar på den?

Det enda relaterat till ryska jag kan tänkas ha sysslat med är att jag öppnat filer som skickats med ICQ och ICQ är väl ryskägt sen några år.
nifelheim
Den första
Inlägg: 2318
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av nifelheim »

vatten.PNG
borde väl vara en enkel matte övning att räkna ut flödet för att ta ut till exempel 5 kW vid en sänkning med 0.2 grader :)

gissar att det blir ganska mycket...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
MiaM
Inlägg: 9912
Blev medlem: 6 maj 2009, 22:19:19

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av MiaM »

Hur mycket skiljer temperaturen beroende på djup? Det är väl ett par meter från vattenytan till botten.
GFEF
Inlägg: 2370
Blev medlem: 4 december 2004, 18:44:04

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av GFEF »

Att hämta sjövatten nära botten borde ge värmare vatten än nära ytan.

En sug ledning med intag ca 0,5m från botten borde ge lägre strömförbrukning.

Med de nya definitionerna av kilogram och meter är vattnets densitet vid +4 °C 0,99995 kg/dm3.

Vid alla andra temperatur lägre.

https://sv.wikipedia.org/wiki/Densitet
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Nu försöker jag snacka med energimätaren. Så här ser min kod ut:

Kod: Markera allt

#include <SPI.h>
#include <Controllino.h>

char initMessage[] = {0x2f, 0x3f, 0x21, 0x0d, 0x0a};
char setReadoutMode[] = {0x06, 0x30, 0x34, 0x30, 0x0D, 0x0A};
String readBuffer;

void setup() {
  // Seriesnöre till dator för debug  
  Serial.begin(9600);
  
  /* Initialize CONTROLLINO RS485 direction control DE/RE pins and Serial3 */
  Controllino_RS485Init(9600);
}

void loop() {

  bool isInitialized = 0;

  while (!isInitialized) {
    Serial.print("Skickar initMessage: ");
    Serial.write(initMessage);
    Controllino_RS485TxEnable();
    Serial3.write(initMessage);//, sizeof(initMessage));
    Serial3.flush(); // wait until the trasmission is complete

    Controllino_RS485RxEnable();
    readBuffer = Serial3.readString();
    Serial.print("Svar: ");
    Serial.println(readBuffer);
    Serial.print("Svar tecken för tecken i HEX: ");
    for (int i=0;i<sizeof(readBuffer);i++) {
      Serial.print(readBuffer[i], HEX);
      Serial.print(' ');
    }
    Serial.println();
    Serial.println();
    
    if (readBuffer == "rätt svar") {
      isInitialized = 1;
      Serial.println("\nInitierad!");
    }
  }
  while (isInitialized) {
    Controllino_RS485TxEnable();
    Serial3.write(setReadoutMode);//, sizeof(initMessage));
    Serial3.flush(); // wait until the trasmission is complete    

    Controllino_RS485RxEnable();
    readBuffer = Serial3.readString();
    Serial.print(readBuffer);
  }
}
Och det som kommer ut på seriesnöret:

Kod: Markera allt

Skickar initMessage: /?!
Svar: 
Svar tecken för tecken i HEX: 0 0 0 0 0 0 

Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮

Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C 

Skickar initMessage: /?!
Svar: ⸮
Svar tecken för tecken i HEX: FFFFFF95 0 0 0 0 0 

Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮

Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C 

Skickar initMessage: /?!
Svar: ⸮
Svar tecken för tecken i HEX: FFFFFF95 0 0 0 0 0 

Skickar initMessage: /?!
Svar: 
Svar tecken för tecken i HEX: 0 0 0 0 0 0 

Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮

Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C 

Enligt manualen ska jag ju få nåt liknande "/EFR5\EFR-M4-DRV004101222<CR><LF>" tillbaka. Nåt lurigt med HEX/ASCII-konverteringen? Jag tycker ju att jag borde få ut nåt mellan 00 och FF när jag försöker skriva ut varje byte i readBuffer och inte t.ex. FFFFFFAF som ju är 4294967215 decimalt.

Kanske ska jag inte köra en String readBuffer utan istället typ char readBuffer[50] och sen läsa in byte för byte?
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av Nerre »

Paritet? Fel "polaritet"? (D.v.s. 1 ska vara 0.)

När man pillade med vanliga gamla serieportar bommade man väl ofta på att 1 var typ -9 V och 0 var + 9 V eller nåt sånt.
MattisLind
Inlägg: 738
Blev medlem: 27 maj 2011, 20:27:12
Ort: Älvsjö
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av MattisLind »

Det ser ut som de negativa bytearna du får in signextendas till 32bits integer. Jag tänker att om du gör Serial.print(0xff & readBuffer, HEX); så blir det vackrare utskrift. Sedan verkar det vara något med paritet som nämndes ovan. Om man kollar i de bytes du får in så har de jämnt antal ett satta bits. Sannolikt har du jämn paritet i det data du får in. Ställ in din UART för 7 bits och jämn paritet så skall du se att det blir bättre. T ex Serial.begin(9600, SERIAL_7E1);
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Tackar så mycket för hjälpen!

Nu ser det ut så här och jag lyckas snacka med mätaren. Bara resten av programmet kvar...

Kod: Markera allt

#include <SPI.h>
#include <Controllino.h>

char initMessage[] = {0x2f, 0x3f, 0x21, 0x0d, 0x0a};
char setReadoutMode[] = {0x06, 0x30, 0x35, 0x30, 0x0D, 0x0A};
String readBuffer;

void setup() {
  // Seriesnöre till dator för debug  
  Serial.begin(9600);
  
  /* Initialize CONTROLLINO RS485 direction control DE/RE pins and Serial3 */
  Controllino_RS485Init(9600);
  Serial3.begin(9600, SERIAL_7E1); // Controllinos bibliotek stöder inte config-argumentet så det behöver göras här. 

}

void loop() {

  bool isInitialized = 0;

  while (!isInitialized) {
    Serial.print("Skickar initMessage: ");
    Serial.write(initMessage);
    Controllino_RS485TxEnable();
    Serial3.write(initMessage);//, sizeof(initMessage));
    Serial3.flush(); // wait until the trasmission is complete

    Controllino_RS485RxEnable();

    readBuffer = Serial3.readString();
    Serial.print("Svar: ");
    Serial.println(readBuffer);
    Serial.print("Svar tecken för tecken i HEX: ");
    for (int i=0;i<readBuffer.length();i++) {
      Serial.print(0xff & readBuffer[i], HEX);
      Serial.print(' ');
    }
    Serial.println();
    Serial.println();

    if (readBuffer.startsWith("/EFR5")) {
      isInitialized = 1;
      Serial.println("\nInitierad!");
    }
  }
  while (isInitialized) {
    Controllino_RS485TxEnable();
    Serial3.write(setReadoutMode);//, sizeof(initMessage));
    Serial3.flush(); // wait until the trasmission is complete    

    Controllino_RS485RxEnable();
    readBuffer = Serial3.readString();
    Serial.print(readBuffer);
  }
}
Resultatet:

Kod: Markera allt

Skickar initMessage: /?!
Svar: /EFR5\EFR-M4-DRV004101222

Svar tecken för tecken i HEX: 2F 45 46 52 35 5C 45 46 52 2D 4D 34 2D 44 52 56 30 30 34 31 30 31 32 32 32 D A 


Initierad!
EFR-M4-DRV004101222
1-0:0.0.0*255(GETTONE)
1-0:1.8.0*255(00000.00*kWh)
1-0:2.1.7*255(00000.00*kWh)
1-0:4.1.7*255(00000.00*kWh)
1-0:6.1.7*255(00000.00*kWh)
1-0:21.7.255*255(0000.0015*kW)
1-0:41.7.255*255(0000.0000*kW)
1-0:61.7.255*255(0000.0000*kW)
1-0:1.7.255*255(0000.0000*kW)
1-0:96.5.5*255(	)
0-0:96.1.255*255(11402295)
!
:
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Nu har jag lyckats få till att läsa elmätaren i alla fall!

Dock ballar det ur när jag försöker lägga ihop det med mitt program som läser temperatursensorer och skickar upp det på internets till Cayenne. Båda programmen funkar perfekt var för sig, men när jag försöker lägga ihop dem får jag ingen kontakt med elmätaren.

Jag använder Tempsensorer DS18B20 och snackar med Cayenne via Ethernet. Men så fort jag försöker läsa av sensorerna eller skicka data via Ethernet så går RS485-kommunikationen sönder. Jag får helt enkelt inget svar alls från mätaren. Tempsensorerna sitter på OneWire på Pin 6 (Pinout här) men jag har även testat att ha dem på Pin 20.

Ethernet och OneWire funkar ju bra tillsammans enligt koden nedan. Men om jag avkommenterar raden som kör getMeterStatus(), d.v.s. försöker prata med mätaren, så fastnar programmet då jag inte får svar. Jag har testat att gå andra vägen och ta mitt fungerande RS485-program och lägga till del för del av temperaturmätarprogrammet men så fort jag försöker läsa OneWire ELLER initiera Ethernet så pajjar det.

RS485 kör jag ju nu via Serial3 och jag har försökt skumma igenom både OneWire- och Cayennebiblioteken för att se om de bråkar med Serial3 men inte hittat något.

Nån som har nåt tips om var jag ska leta efter en lösning?

Kod: Markera allt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Controllino.h> 
#include <CayenneMQTTEthernet.h>

#define DS18B20_PIN 6
#define CAYENNE 1	// used to enable/disable cayenne logging
//#define CAYENNE_PRINT Serial  // Comment this out to disable prints and save space

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "00f091e0-4053-11e9-b395-f53190c2ab6f";
char password[] = "xxx";
char clientID[] = "8279bbb0-4053-11e9-9622-9b9aeccba453";

// Elmätarens status. 0-4 = Mätarställning, kW på fas 1, 2, 3 och alla faser.
float meterStatus[5]={142525.54, 10.1, 20.2, 30.3, 40.4};

// Saker för att kommunicera med elmätaren
const char initMessage[] = {0x2F, 0x3F, 0x21, 0x0D, 0x0A};
const char setReadoutMode[] = {0x06, 0x30, 0x35, 0x30, 0x0D, 0x0A};

// MAC?: FE-38-85-62-17-19
// Kommer från Cayennes exempelskiss

// Create a Onewire Referenca and assign it to pin 20
OneWire oneWire(DS18B20_PIN);

// declare as sensor reference by passing oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// The addresses to the sensors are hard coded
const char tempSensors[15]∞ = {{0x28, 0x88, 0x98, 0x28, 0x00, 0x00, 0x80, 0x3C},
							  {0x28, 0x44, 0xA7, 0x28, 0x00, 0x00, 0x80, 0x35},
							  {0x28, 0xBC, 0x87, 0x28, 0x00, 0x00, 0x80, 0x1E},
							  {0x28, 0xEA, 0xA4, 0x28, 0x00, 0x00, 0x80, 0x34},
							  {0x28, 0x5A, 0xA2, 0x28, 0x00, 0x00, 0x80, 0xAF},
							  {0x28, 0x7A, 0x91, 0x28, 0x00, 0x00, 0x80, 0xD3},
							  {0x28, 0x3E, 0xA0, 0x28, 0x00, 0x00, 0x80, 0x33},
							  {0x28, 0xE1, 0x94, 0x28, 0x00, 0x00, 0x80, 0x48},
							  {0x28, 0x09, 0x95, 0x28, 0x00, 0x00, 0x80, 0x0D},
							  {0x28, 0x55, 0xA9, 0x28, 0x00, 0x00, 0x80, 0xFB},
							  {0x28, 0x83, 0x8A, 0x28, 0x00, 0x00, 0x80, 0x3B},
							  {0x28, 0x2B, 0x52, 0x01, 0x00, 0x00, 0x80, 0x45},
							  {0x28, 0xE7, 0x9F, 0x28, 0x00, 0x00, 0x80, 0x8A},
							  {0x28, 0xDF, 0x92, 0x28, 0x00, 0x00, 0x80, 0x2A},
							  {0x28, 0xBF, 0x93, 0x28, 0x00, 0x00, 0x80, 0x24}};

const float sensorZeroCalibration[15] = {0.125, 0.250, 0.250, 0.250, 0.125, 0.250, 0.375, 0.500, 0.250, 0.250, 0.375, 0, 0.375, 0, 0.375};	
	// Dessa kokpunkter mättes med nollpunktskorrigeringen påslagen!
	// Kokpunkt vid tillfället 99,44 *C
	//const float sensor100Calibration[15] = {99.125, 98.875, 99.375, 98.875, 99.125, 98.875, 98.875, 98.5, 99.375, 99.250, 98.875, 99, 99.25, 97.375, 98.625};

float tempC;

// Startar kommunikation med och läser ställningen på elmätaren
void getMeterStatus() {
	int index=0, isInitialized=0;
	String readString, readBuffer;

  Controllino_RS485Init(9600);
  Serial3.begin(9600, SERIAL_7E1); // Controllinos bibliotek stöder inte config-argumentet så det behöver göras här. 

  Serial.print("i getMeter!");
  while (!readBuffer.startsWith("/EFR5")) {
    Controllino_RS485TxEnable();
    Serial3.write(initMessage);//, sizeof(initMessage));
    Serial3.flush(); // wait until the trasmission is complete
  	Serial.write("Init: "); Serial.write(initMessage); Serial.println();
    Controllino_RS485RxEnable();
    readBuffer = Serial3.readString();
    Serial.println(readBuffer);
    for (int i=0;i<readBuffer.length();i++) {
      Serial.print(0xff & readBuffer[i], HEX);
      Serial.print(' KOMMER HIT? ');
    }
  }

  Controllino_RS485TxEnable();
  Serial3.write(setReadoutMode);
  Serial3.flush(); // wait until the trasmission is complete
  Controllino_RS485RxEnable();  
  readBuffer = Serial3.readString();
  Serial.print(readBuffer);

  index = readBuffer.indexOf("1-0:1.8.0*255") + 14;
  readString = readBuffer.substring(index,index+8);
  meterStatus[0] = readString.toFloat();
  index = readBuffer.indexOf("1-0:21.7.255*255") + 17;
  readString = readBuffer.substring(index,index+9);
  meterStatus[1] = readString.toFloat();
  index = readBuffer.indexOf("1-0:41.7.255*255") + 17;
  readString = readBuffer.substring(index,index+9);
  meterStatus[2] = readString.toFloat();    
  index = readBuffer.indexOf("1-0:61.7.255*255") + 17;
  readString = readBuffer.substring(index,index+9);
  meterStatus[3] = readString.toFloat();
  index = readBuffer.indexOf("1-0:1.7.255*255") + 16;
  readString = readBuffer.substring(index,index+9);
  meterStatus[4] = readString.toFloat();
}


void setup(void)
{
	Serial.begin(9600); 

	if(CAYENNE) {Cayenne.begin(username, password, clientID);}

	for (int i=0;i<15;i++) {
		// set the resolution to 11 bit - Valid values are 9, 10, or 11 bit.
		sensors.setResolution(tempSensors[i], 11);
		// confirm that we set that resolution by asking the DS18B20 to repeat it back
		Serial.print("Sensor Resolution: ");
		Serial.println(sensors.getResolution(tempSensors[i]), DEC); 
		Serial.println();
	}

}

void loop(void)
{ 
	while (1) {
		// Läs elmätaren via RS485
		//getMeterStatus();
		if(CAYENNE) {
			Cayenne.virtualWrite(15, meterStatus[0], "analog_sensor", "null");
			Cayenne.virtualWrite(16, meterStatus[1], "analog_sensor", "null");
			Cayenne.virtualWrite(17, meterStatus[2], "analog_sensor", "null");
			Cayenne.virtualWrite(18, meterStatus[3], "analog_sensor", "null");
			Cayenne.virtualWrite(19, meterStatus[4], "analog_sensor", "null");
		}
		// Läs tempsensorerna och skicka in på Cayenne
		for (int n=0;n<15;n++) {
			sensors.requestTemperaturesByAddress(tempSensors[n]); // Send the command to get temperatures 
			tempC = sensors.getTempC(tempSensors[n]);// - sensorZeroCalibration[n];
			Serial.print("Sensor "); Serial.print(n); Serial.print(" :"); Serial.print(tempC, 4); Serial.println(" *C");
			if(CAYENNE) {Cayenne.celsiusWrite(n, tempC);}
			delay(100);
		}

		delay(3000);
		Serial.println("\n");
	}
}
MiaM
Inlägg: 9912
Blev medlem: 6 maj 2009, 22:19:19

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av MiaM »

Nån interruptdelning som kräver specialhantering eller?

*spekulerar vilt*
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Ja, det är nåt skumt som händer bakom kulisserna vid kompilering. Även om jag aldrig kör Cayenneinitieringen (Cayenne.begin(username, password, clientID)) utan lägger den EFTER RS485-läsningen så pajjar elmätarläsningen.
Användarvisningsbild
gunne
Inlägg: 2070
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av gunne »

Jag har tyvärr inte hunnit lösa det här än. Men jag har pulat med annat. T.ex. har jag inskaffat ventilstängare och håller på att mecka ihop dem med kulventiler (DN50).
IMG_20190404_153703 (Medium).jpg
Kopplar man in 24 V så är det en liten motor i som öppnar ventilen och samtidigt spänner en klockfjäder. Vid strömbortfall stänger fjädern ventilen automatiskt. Känns som en skön försäkring att ha...

Jag håller på att fundera på styrning av sjövattenpumpen. Nu sitter det en centrifugalpump med en 0,55 kW asynkronmotor. Många gånger behövs bara en bråkdel av flödet så planen är att styra motorn via en frekvensomformare. Men jag funderar lite på vad det finns för energieffektivare alternativ.

Om pumpen går på halv effekt hela året så kostar det 0,55 kW * 0,5 * 24 h * 365 * 1,75*1,25 kr/kWh = 5270 kr/år. Det finns alltså potential att spara en del slantar om man kan få ner energiförbrukningen.

Jag funderade på att köra en PM-motor med styrning (t.ex. BLT-650 här). Men då måste man också ha ett nätagg 48V 20A och frågan är om effektiviteten på hela systemet blir bättre än med en asynkronmotor och en modern frekvensomformare? Båda verkar ju ha en verkningsgrad kring typ 80 % vid märkvarvtal och sjunkande vid sjunkande varvtal. Någon som har input eller tips om energieffektiva motorer krin 0,5 - 1 kW?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Repen
Inlägg: 213
Blev medlem: 6 januari 2009, 20:11:31
Ort: Kvidinge

Re: Projekt Stor-Erik, renovering av ångbogserbåt

Inlägg av Repen »

Kolla vad förbrukningen blir om du bara stryper den på trycksidan av pumpen , det är ett normalt förfarande för att minska flödet/effekten, men absolut inte på sugsidan då det skapar kavitation på impellern.
Skriv svar