Hoe te includen in C++ [NModbus]

Helpdesk & Vraag/Aanbod
Post Reply
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Hoe te includen in C++ [NModbus]

Post by HobbeS »

Ik heb op internet een mooie libary gevonden om een modbus master op een computer te realiseren. http://www.nmodbus.com

Nu het grote probleem. Ik weet niet hoe ik dit moet includen in mijn C++ project. Wie kan mij vertellen hoe ik dit gebruik wat op http://www.nmodbus.com ?

Heel erg bedankt die deze (waarschijnlijk makkelijk & basic) vraag kan beantwoorden! ^:^


Ohja: Ik gebruik nu Visual Studio of kan ik beter een ander programma gebruiken dat dat makkelijker maakt?
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Ik ben bang dat je naar een andere implementatie moet zoeken:
Modbus is a C# 2.0 implementation of the Modbus protocol.
Het is dus gemaakt in C Sharp...
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Ah! Ik zie het probleem!
Maar wat kan ik er aandoen? Een andere programmeer omgeving of zie ik het nog verkeerd..?

Ik kan geen andere (gratis) libary o.i.d. vinden...
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

C++ en C# zijn twee verschillende programeertalen. Als je al een programma hebt gemaakt in C++ en je wilt dat uitbreiden met deze modbus module, dan zul je naar een andere moeten gaan zoeken.

Als je nog (helemaal) moet beginnen, dan zou je even moeten kijken naar je Visual Studio versie of die C# ondersteund, en dat als uitgangspunt nemen.

Mag ik vragen wat je gaat maken? /me heeft ook redelijk veel gedaan met Modbus, maar dan met de TCP/IP versie
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Ik wil met Modbus RTU een PLCtje uitlezen.. In dit PLCtje heb ik een urentellertje geschreven.. Nu wil ik dus simpel en snel een exe schrijven die een aantal Holding registers uitleest uit het PLC..

Ofwel via de comport van de PLC via een converter naar RS485 wat gegevens uitlezen.. Wat ik zag wat op http://www.nmodbus.com staat lijkt simpel en mooi om te gebruiken..
Ik heb Visual Studio.Net 2003 geinstalleerd staan dus volgens mij moet het dan lukken of niet? Ik moet met het PC programmatje nog helemaal beginnen dus ik kan alle kanten nog op :)

(Maar ik dacht dus op de site van NModbus te hebben gezien dat eht ook met C++ kon werken.. Maar het maakt me niks uit nu ga ik het met C# proberen!)
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Hmm ik krijg het er ook niet in in C# :S

Hier iemand een idee wat ik verkeer kan doen?
[IMG:1280:1024]http://i14.tinypic.com/6b3fjnm.jpg[/img]
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Hmm wazig, blijkbaar is die DLL niet lekker gecomipleerd.. Maar had je ook al geprobeerd om de source code te downloaden en die gewoon in je project te gebruiken?
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Ah die heb ik wel gedownload maar nog niet geprobeerd! :)

Dat ga ik nu proberen!
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Wat voor PLC heb je? En wat is het uiteindelijke doel? Ik neem aan dat je het niet stoer vindt om naar een urentellertje te gaan kijken ;)
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Nope dat is het niet.. Op een schip hebben ze een onderhoudsprogramma.. Dat onderhoudsprogramma moet weten hoeveel uur de hoofdmotor heeft gedraaid en hoeveel uur de 3 generator sets hebben gedraaid om aan te geven wanneer er standaard onderhoud nodig is.
Vandaar dat ik daar lokaal een plctje heb geplaatst (Twido van Schneider, klein onmogelijk #$%^& ding) en ik die wil uitlezen met Modbus.

Ik heb de source proberen in te laden maar de .dll bestanden die daar bij zitten krijg ik precies de zelfde fouten...
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Als je alleen wilt uitlezen volsta je door functie 3 te implementeren (ReadMultipleRegisters). Volgens mij moeten daarvoor genoeg voorbeelden te vinden zijn. Zelf heb ik een keer een C implementatie van Modbus TCP/IP gemaakt, dus daar heb je weinig aan...
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Ik ga het nog is proberen om de hele boel er in te krijgen van NModbus.. Het klopt ik heb alleen functiecode 3 nodig voor deze toepassing.

Maar voor het lekkere hobbyen hoop ik toch dat ik alles erin kan krijgen!

Heb jij nog tips hoe ik het er in kan krijgen?
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Het is mij onderhand gelukt NModbus te includen omdat ik ook geen goede vervanger kon vinden...

Het was een kwestie van een C++ CLR project aanmaken en dan de regel #using "Modbus.dll" en natuurlijk Modbus.dll kopieren naar de project directory...

Maar helaas schieten mijn C++ skills weer te kort om er wat fatsoenlijks van te maken. Kan iemand is kijken wat ik fout doe?

Code: Select all

#include "stdafx.h"
#include <iostream>
#include <string>

#using "Modbus.dll"
#using "log4net.dll"

using namespace std;

using namespace System;
using namespace System::Diagnostics;
using namespace System::IO::Ports;
using namespace System::Threading;
using namespace Modbus;
using namespace Modbus::Device;

public ref class MyModbusMasterClass : public ModbusMaster {
public:
	void MyModbusMaster() { 
		SerialPort^ port;
		port = gcnew SerialPort("COM2");
		port->BaudRate = 9600;
		port->DataBits = 8;
		port->StopBits = StopBits::One;
		port->Parity = Parity::Even;
		port->Open();
		MyModbusMasterClass^ CreateRtu(port);
	}
};

void main()
{
	cout << "Reading out data from Main Engine & Generator sets...";

	MyModbusMasterClass master;

	master.MyModbusMaster();

//	SerialPort^ port;
//	port = gcnew SerialPort("COM2");

//	ModbusSerialMaster^ CreateRtu (SerialPort^ port);
	
	unsigned char slaveID = 10;
	unsigned short startAddress = 10;
	unsigned short registers = 5;
		
	master.ReadHoldingRegisters(slaveID, startAddress, registers);
	//read five registers
	//master->ReadHoldingRegisters(slaveID, startAddress, registers);
	cin.get();
}
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Kan je misschien aangeven wat de foutmelding is? Of wat je wilt dat hij zou moeten doen, maar niet doet. Anders wordt een beetje lastig zoeken ;)
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

Nou het probleem is dat ik het niet voor elkaar krijg iets uit te lezen.. Ik krijg het spul dus goed geinclude maar ik krijg het niet voor elkaar om de goede functies op de goede manier aan te roepen...

Het is niet zozeer dat ik nu hele vreemde foutmeldingen krijg mar ik weet niet meer hoe ik verder moet :S
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Heb je geen voorbeeld kunnen vinden op internet? Vaak zitten bij dit soort modules ook wel voorbeelden hoe je ze moet gebruiken.

Maar als ik het zo even bekijk, geef je nog nergens aan dat hij verbinding moet maken (dus dat hij de seriele poort moet openen etc..)

[edit] Hier staan een hoop voorbeelden:
http://www.nmodbus.com/Samples.aspx
[/edit]
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

madman wrote:Maar als ik het zo even bekijk, geef je nog nergens aan dat hij verbinding moet maken (dus dat hij de seriele poort moet openen etc..)
Hmm, nou ik heb wel een stukje erin zitten dat hij de poort moet openen/aanroepen alleen lukt het niet met de CreatRTU functie..

Ik moet zeggen dat dit de eerste keer is dat ik een dll file include en ik moet zeggen dat ik de structuur nog niet helemaal door heb. Hij jij hier wel een helder beeld van..?
madman wrote:Heb je geen voorbeeld kunnen vinden op internet? Vaak zitten bij dit soort modules ook wel voorbeelden hoe je ze moet gebruiken.

[edit] Hier staan een hoop voorbeelden:
http://www.nmodbus.com/Samples.aspx
[/edit]
Nou deze voorbeelden zijn nog niet zo makkelijk als je zou denken. Het probleem is dat de voorbeelden niet compleet zijn en het dus maar een 'klein' stukje code is en deze voorbeelden zijn niet C++ gebaseerd...
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

In feite is een DLL niets anders dan een gecompileerde C++ file. Deze stelt je functies etc ter beschikking die je weer kan gebruiken in je eigen programma.

Helaas is de laatste keer dat ik wat in C++ gedaan heb al weer een paar jaartjes terug, dus hoe het precies moet weet ik niet. Maar je kan toch gewoon het C# vertalen naar C++?

Code: Select all

using (SerialPort port = new SerialPort("COM1"))
{
	// configure serial port
	port.BaudRate = 9600;
	port.DataBits = 8;
	port.Parity = Parity.None;
	port.StopBits = StopBits.One;
	port.Open();

	// create modbus master
	IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

	byte slaveID = 1;
	ushort startAddress = 100;
	ushort[] registers = new ushort[] { 1, 2, 3 };

	// write three registers
	master.WriteMultipleRegisters(slaveID, startAddress, registers);
}
In pseudo code staat hier:

Code: Select all

Maak een nieuwe seriele poort "port" aan
En als dat is gelukt, ga dan verder:
Stel de nodige variabelen van "port" in (dus BaudRate, DataBits, Parity en StopBits)
Open seriele poort "port"
Maak een nieuwe ModbusMaster aan door CreateRTU aan te roepen met de geopende seriele poort.

Gebruik de master om registers te schrijven
Nu aan jou de eer om dit te vertalen naar C++ ;)
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

madman wrote:Maak een nieuwe ModbusMaster aan door CreateRTU aan te roepen met de geopende seriele poort.
Het aanroepen van de CreateRTU functie is dus eigenlijk het 'enige' wat nog niet goed gaat..

Hier de code die ik had zoals jij het hierboven had beschreven:

Code: Select all

#include "stdafx.h"
#include <iostream>
#include <string>

#using "Modbus.dll"
#using "log4net.dll"

using namespace std;

using namespace System;
using namespace System::Diagnostics;
using namespace System::IO::Ports;
using namespace System::Threading;
using namespace Modbus;
using namespace Modbus::Device;

void main()
{
	cout << "Reading out data from Main Engine & Generator sets...";
        
	SerialPort port("COM2");

		// configure serial port
        port.BaudRate = 9600;
        port.DataBits = 8;
        port.Parity = Parity::Even;
        port.StopBits = StopBits::One;
        port.Open();

        // create modbus master						----!! Het probleempunt!
        IModbusSerialMaster^ master;
        //IModbusSerialMaster^ CreateRtu(port);

        unsigned char slaveID = 10;
        unsigned short startAddress = 100;
        unsigned short registers = 5;
        
		//read five registers
        master.ReadHoldingRegisters(slaveID, startAddress, registers);
	
	cin.get();
}
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Misschien dat het voorbeeld op deze oostblok site je wat kan helpen:
http://programujte.com/forum.php?akce=p ... svc++--net
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

madman wrote:Misschien dat het voorbeeld op deze oostblok site je wat kan helpen:
http://programujte.com/forum.php?akce=p ... svc++--net
Hmm.. Mooi gevonden maar helpt niet echt heb nog even geprobeerd wat zij daar anders deden maar dat is ook niks volgens mij..
Volgens mij is het hun daar niet gelukt.. Maar kan het ook niet helemaal volgen... ;)
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
madman
2nd Admin
Posts: 4958
Joined: 14 Jun 2003, 21:41
Location: Arnhem
Contact:

Post by madman »

Daar had ik ook al last van :D

Helaas heb ik nu niet veel tijd om te gaan zoeken, maar zal binnenkort nog ff een poging doen
venomous
Posts: 1152
Joined: 15 Jun 2003, 16:01
Location: Voorburg
Contact:

Post by venomous »

Wat is nu eigenlijk het probleem? Nou is mijn c++ skill ook weer erg ver weg, maar je definitie van master moet gewoon goed zijn.

bv: IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
"The past will often attack the present with the pain of your memories"
HobbeS
Posts: 1651
Joined: 04 Apr 2004, 18:42
Location: Heino
Contact:

Post by HobbeS »

venomous wrote:Wat is nu eigenlijk het probleem? Nou is mijn c++ skill ook weer erg ver weg, maar je definitie van master moet gewoon goed zijn.

bv: IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
Alleen dat pakt hij helaas om 1 of andere vage reden niet.. Ik heb geen idee waar het aan kan liggen..

Gelukkig kan ik het even aan de kant leggen ik heb het opgelost door het even in C# uit te voeren en hoe ik het wou hebben werkt nu in iedergeval. Maar omdat ik zelf meer met Modbus werk wil ik de hele handel nog wel werkend krijgen eigenlijk dus waarschijnlijk dat ik het over een paar dagen weer oppak :)
[url=http://www.heinoken.nl/proxy/stats/index.html]Team Heinoken[/url] Flusht naar u toe deze zomer!
Kijk een keer op [url=http://www.heinoken.nl]Heinoken[/url] voor uitgaansfoto's & het bruisende leven rond Heino..
Post Reply