Business logica

Business logica is wat Smart Industry 'smart' maakt.

Business logic is de logica van de bedrijfsvoering, zoals wat er gebeurt als een order of een werkorder beeindigd is en wat er gevalideerd moet worden voordat een machine of een order gestart kan worden. Zoveel bedrijven als er zijn, zoveel verschillende sets van logica er bestaan.

Taken voor business logica zijn redundant uitgevoerd over de servers en bewaakt

Taken voor business logica zijn redundant uitgevoerd over de servers en bewaakt

Business logica komt in MESBuilder op twee plaatsen voor : op de client of als achtergrond taken op de server. De taken worden dan getriggerd door een event of een timer. De achtergrond taken op de server zijn redundant en bewaakt. Dat wil zeggen dat een bepaalde server bij voorkeur de taak uitvoert. Wordt deze taak niet meer uitgevoerd door deze server, dan neemt een andere server de achtergrond taak over.

Wij geloven in programmeren ipv. configureren...

Geen achtdaagse configuratietraining

Geen achtdaagse configuratietraining

In uitgebreide configuratie om functionaliteit aan- of af te schakelen of andersinds te configureren geloven wij niet zo. Tenzij de klant een super standaard bedrijfsvoering heeft, passend in een bepaalde branche.
De praktijk leert echter dat ieder bedrijf onderscheidend is. Dit hangt natuurlijk samen met concurrentiekracht. Men wil operations net even iets anders doen dan de buurman om het onderscheid te maken.
Bij een pakket dat een rigide model bevat van een complete branche betaal je dan twee keer de prijs : de eerste keer in de zin dat een gedeelte van de gewenste logica niet kan worden geconfigureerd en dat deze logica er tailormade bij moet worden gemaakt en de tweede keer dat je een groot gedeelte van de features van het pakket niet nodig hebt.

...maar dan wel 'Rapid Application Development' programmeren.

Configureren is voor ons type klanten geen optie, daarom kiezen wij ervoor om achtergrond- en clientlogica te programmeren, maar dan wel in RAD 'Rapid Application Development' stijl.
Als er bij ons geprogrammeerd wordt, dan is alles gebaseerd op snelheid en snel een toepassing kunnen maken. Dat wil zeggen dat de templates waarin de business logica taken geprogrameerd worden al helemaal zijn gegenereerd, dat de code simpel is en dat er snel functionaliteit kan worden geschreven.

Ongelimiteerde mogelijkheden

Onze RAD programmering biedt ongelimiteerde mogelijkheden. Ieder object laat zich transparant lezen en schrijven. Bij een programmaregel als 'ReadObject' hoeft de programmeur zich niet druk te maken welke server er online is en welke niet of dat het object uit een PLC of uit een ERP systeem komt. Het wordt gewoon gelezen vanaf de - op dat moment - best beschikbare server.

Het lezen vanuit ERP en het schrijven naar de PLC is niet meer dan:

  • ReadObject<ERPdataregel>()
  • bewerking
  • WriteObject<PLCdatablock>()

en bedenk hierbij : u bepaalt wat de objecten 'ERPdataregel' en 'PLCdatablock' zijn in de modellering.

Het programmeren benadert dus zo dicht mogelijk de logische regels in de bedrijfsvoering. Al het andere eromheen is weg ge-automatiseerd.

Programmering is snel en simpel

De meest gebruikte taal, de meeste programmeurs voor te vinden

De meest gebruikte taal, de meeste programmeurs voor te vinden

De programmering van de finesses zoals uitvoering van de business regels op de achtergrond – bijvoorbeeld wat er gebeurt na afloop van een proces - gebeurt in de programmeertaal c#, is eenvoudig en kan gebeuren door een programmeur met junior skills. De plaatsen waar de code moet komen zijn al gegenereerd. De programmeeromgeving is een aangepaste versie van Microsoft Visual Studio 2013. De reden waarom we hiervoor kiezen en niet voor een eigen progammeertaal is dat c# de meest gebruikte programmeertaal is en hiervoor de de meeste programmeurs beschikbaar zijn. Ook kan men volop en ongelimiteerd gebruikmaken van alle duizenden features die ooit zijn bedacht en ontwikkeld om het leven van een programmeur zo aangenaam mogelijk te maken. Een goed voorbeeld is Linq, waardoor lezen, analyse en manipulatie op een tabel met gelezen dataobjecten uit een MESBuilder server een peuleschil is.

Ook de graphics van de clients en webserver worden gegenereerd

De clients inclusief de user interfaces worden ook standaard mee gegenereerd. Userinterfaces moeten dus alleen worden aangepast en worden niet vanaf de grond opgebouwd.
Voor de terminals bij de machines gebruiken we meestal Windows applicaties. Voor desktops, tablets en smartphones is een webapplicatie beschikbaar. Het naar wens aanpassen van de gegenereerde grafische pagina’s en webpagina’s is werk voor een medior programmeur en kost relatief gezien de meeste tijd. Het streven is altijd naar een minimaal aantal handelingen voor een operator op de werkvloer en het onmogelijk maken van foute invoer. Hierdoor zit er relatief veel logica in een pagina, wat niet te vermijden is.

RAD style logica in C#

RAD style logica in C#

De classes en functies van de achtergrond logica en hun beschrijvingen worden gegenereerd, de  programmeur kan de logica (de body van de functie) op simpele wijze implementeren.

Een voorbeeld van code

Als u geen programmeur bent is geen enkel stuk code simpel, maar wij dagen u uit om toch eens naar het stuk code hiernaast te kijken.
De geel onderstreepte regels geven de bewerkingen op data weer: readobject, writeobject, historize object.  Hier worden objecten op de server gelezen, geschreven en naar de historian geschreven. De blauwe woorden tussen <> zoals <RunRecord> geven de objecttypen weer. Deze worden in het model bepaald

Een programmeur hoeft geen OPCUA of database specialist te zijn. 

De programmeur heeft niets te maken met low level zaken zoals connecties met OPCUA servers, databases, browsing, taak redundantie, synchronisatie, redundantie en hoeft ook niet de OPCUA standaard door en door te kennen. Een programmeur moet alleen thuis zijn in de lees- en schrijf library van MESBuilder, die een handvol functies bevat (zie hieronder)
Voor de aanpassing van de GUI moet de programmeur bekend zijn met standaard zaken zoals windows forms of ASP.net.

Een simple library aan functies doet het werk

Onze library om objecten te lezen en te schrijven bestaat uit een aantal trivale functies voor lezen, schrijven, aanpassen en verwijderen van datarecords (zogenaamde CRUD functies). Deze zijn zowel op de client als op de server (als achtergrond code) te gebruiken. De functies zijn :


Functie


Beschrijving

Lezen objectniveau


ReadObject<ProductieMachineRecord>((adress, out CommResult, out Datarecord);

Leest een set van data van een bepaald type uit een machine, installatie, systeem (IoT of statusrecord) of uit de operations kern

ReadObjectsByFilter<DataRecordType>(filterdata, out resultStatus, out Datarecord)

Leest een gefilterde set van datarecords van een bepaald type gefilterd op adressering. Bijvoorbeeld alle werkorders gedaan door een machine .

Ook voor lezen uit de historian

ReadObjects<ProductieMachineRecord>(adress, ProductieMachineRecord[] RecordsToRead, Request, out OMCommResult CommResult, out ProductieMachineRecord[] RecordsRead)

Leest een set van records via een bulkread aktie.Ook voor lezen uit de historian

QuerieObjects<ProductieMachineRecord>(adress, Request, out OMCommResult CommResult, out ProductieMachineRecord[] ReadRecords)

Leest een set records volgens een uitgebreide querie (datum, eigenschap, unieke code etc)..Ook voor lezen uit de historian

ReadObjectsByReference(Adress, reference, out OMCommResult CommResult, out ReadRecords)

Leest een set van records die een bepaalde relatie (reference) met het hoofdobject. Bijvoorbeeld suborders die bij een order horen.

Schrijven objectniveau


WriteObject<RecordType>(Adress, recordtowrite, request, out OMCommResult CommResult)

Schrijft een record (ook naar de historian)

WriteObjects<RecordType>(Adress, recordstowrite[], request, out OMCommResult CommResult, recordswritten)

Schrijft een set van records (bulk write)(ook naar de historian)

Insert  objectniveau


InsertObject<RecordType>(Adress, recordtoinsert,request, out OMCommResult CommResult)

Insert een record dynamisch, mits het record type dat toelaat. Insert een record in de historian , een snapshot

InsertObjects<RecordType>(Adress, recordstoinsert[], request, out OMCommResult CommResult, out recordsinserted[])

Insert een set van records dynamisch  (bulk insert)(ook naar de historian)

Delete objectniveau


DeleteObject<RecordType>(Adress,,request, out OMCommResult CommResult)

Verwijdert een record van de OPCUA UA servers en van het onderliggende systeem (mits het toegelaten is)

DeleteObjects<RecordType>(Adress,objects,request, out OMCommResult CommResult)

Verwijdert een set van records uit de OPCUA UA servers en van het onderliggende systeem (mits het toegelaten is) (bulk delete)

Variable niveau



Iedere variabele in ieder object kan individueel worden geschreven en gelezen. Dit geldt ook voor properties. Een variable of een property kan ook op de gewone OPCUA manier worden geschreven of gelezen vanuit een third party OPCUA client.