Matematikföretaget jz www.m7005.metem.se 140919/150411/150513/SJn Windows dator M7005 I Q r r _I e e _Q s g g s e I1 - Q1 - e r I40 H Q40 r v r v e e e r g r H1 - H48 S reg S1 - S16 T reg T1 - T80 Akt Mätprogs mätv. _S server _M server _G server _R server Att koda en M7005 Server 1 (40)
Innehåll 1 Ini i M7005... 3 Då M7005 exekveras... 5 2 M7005 Servrar... 6 2.1 Katalogisera server i Windows register... 6 2.2 Varning... 6 3 Exempel på Serverprogram... 7 3.1 ServerXE_IQ / ServerVBNET_IQ... 7 3.2 ServerTransdXE_M / ServerTransdVBNet_M... 8 3.3 ServerMetStyrXE_RS / ServerMetStyr_RS... 9 3.4 ServerGenerellXE_G / ServerGenerellVBNet_G... 11 4 Appendix 1 Funktionsgränssnitt... 13 1.1 Namn och placering... 13 1.2 M7005 IO-system startas... 14 1.3 Alla servrar... 14 1.4 Kommando från M7005 till server... 15 1.5 Givarvärden in till M7005 (_M)... 16 1.5.1 Initiering... 16 1.5.2 Kontinuerligt... 17 1.6 Digitala värde in till M7005 (_I)... 18 1.6.1 Initiering... 18 1.6.2 Kontinuerligt... 19 1.7 Digitala värden ut från M7005 (_Q)... 20 1.7.1 Initiering... 20 1.7.2 Kontinuerligt... 21 1.8 Mätstyrningsdata ut från M7005 (_S)... 22 1.8.1 Initiering... 22 1.8.2 Kontinuerligt... 23 1.9 Svar in till M7005 (_R)... 26 1.9.1 Initiering... 26 1.9.2 Kontinuerligt... 27 1.10 Generell server (_G)... 29 1.10.1 Initiering... 29 1.10.2 Kontinuerlig... 30 1.10.3 Vid behov... 34 5 Appendix 2 Skapa VBNet projekt... 39 Matematikföretaget jz (Sverker Johansson) är under inga omständigheter ansvarigt för direkta skador eller följdskador uppkomna genom användning av detta dokument eller av programvara eller maskinvara beskriven i detta dokument. VARUMÄRKEN OCH PRODUKTNAMNVarumärken och produktnamn omnämnda i detta dokument används uteslutande i redaktionellt syfte och till fördel för dess ägare, utan avsikt att kränka varumärket/produktnamnet. Att koda en M7005 Server 2 (40)
1 Ini i M7005 M7005 har sex dataareor (register) + aktuellt mätprograms mått. De är Windows dator M7005 I Q r r _I e e _Q s g g s e I1 - Q1 - e r I40 H Q40 r v r v e e e r g r H1 - H48 S reg S1 - S16 T reg T1 - T80 Akt Mätprogs mätv. _S server _M server _G server _R server Figur 1. M7005 register och servrar. Input I ( I1 I40) Får sina värden utifrån, av en server eller från Metembussen (M9002). Output Q (Q1 Q40) Sender ut sina värden via någon server eller Metembussen Hjälp register H (både In/Output) H1 H24 är fria att användas efter behag. H25 H32 styr automatiskt programbyte. H33 H48 har alla en fast betydelse, se figur 2. Att koda en M7005 Server 3 (40)
Resultatregistren S De är direkt knutna till mätprogrammets beteende och resultat. Se figur 2. Givarregistren (T1 T80, input) En array av 80 st flyttal som tar emot givarvärden från omvärden antingen vi en server eller via Metembussen Aktuellt mätprograms mått variabler. Dessa kan påverkas direkt av en generell server (_G). Figur 2 visar I, Q, H och S registren i M7005 Att koda en M7005 Server 4 (40)
Då M7005 exekveras M7005 kan sägas bestå av tre olika program delar Kod som körs då en operatör kommuniserar med M7005 med hjälp av tangentbordet och/eller musen. Den koden kallar vi Operatörs koden. Kod som startas av en timer och som sedan genomlöps i sin helhet, här kallad Timerkoden Kod som alltid körs och som går i en egen tråd här kallad RT-koden (RT realtid). Operatörskoden Är den koden som exekveras när man t.ex definierar ett mätprogram, ber att få se på mätresultat osv. Om exekveringen skulle kunna komma i konflikt med Timer-koden eller RTkoden, t.ex om operatören beordrat mätprogrambyte, stoppas Timer-koden och RT-koden tillfälligt tills aktuell operation är slutförd. RT-koden Koden genomlöps kontinuerligt med en kort paus på 2 ms varje varv för att släppa in annan verksamhet. Följande händer Alla servrar anropas, så att de kan skicka ut/ta emot information Digital data skickas ut/hämtas in och givarvärden hämtas in från Metembussen (anslutna M9002:or) Om mätorden är hög beräknas måtten för aktuellt mätprogram. Då mätorden går hög sker diverse initieringar av mätprocessen. Om mätprogrammet är uppdelat i sekvenser kontrolleras om det nu är dags för att byta sekvens Kontroll av att givare som deltar i måttberäkningarna är inom sitt arbetsområde Kontroller om automatiskt byte av mätprogram är begärt. Hoppar upp till första punkten Timer-koden Ca var 5 ms genomlöps Timer-koden som gör Är mastring begärd, mastras mätprogrammet. Om inte Om aktuellt mätprogram har ett tidsintervall för mastring, kontrollera nu om det är dags att mastra. Om registreringsorden har gått låg o Test för orimligt mätvärde o Spara mätvärden i databasen o Blir aktuell grupp full sker diverse uppdateringar och ny grupp påbörjas. o Tala om för intresserade att registreringsorden gått låg o Om mätstyrning, kontroleras om mätstyrningsstrategin föreskriver att mätstyrningsdata skall sändas ut. Om så, skickas korrektörer via en mätstyrningsserver ut till berörd verktygsmaskin När timerns tid löpt ut nästa gång, börjar exekveringen om från första punkten Att koda en M7005 Server 5 (40)
2 M7005 Servrar Kommunikationen mellan M7005 och yttervärden sker via Servrar eller Metembussen (M9002, M9003). En server i M7005 är en exe fil som kommuniserar med M7005 via Microsoft COM-interface. När M7005 startas genomsöks mappen c:\m7005\ioserverlib och hittar då M7005 ett exe program med ett namn YYYYYY_zzzzz där YYYYY är ett godtyckligt namn och zzzz är en kobination av bokstäverna G, I, M, R, S och Q där G = generell server I = digital in server, Skickar in digital information in till M7005, från servern M = är en server som levererar givar värden in till M7005 T1 T80 flyttal ( borde heta T men nu gör den inte det). R = en svars-server som ger svar till M7005 S = mätstyrserver, skickar ut mätstyrningsdata från M7005 till servern Q = digital output, levererar digital information från M7005 till serven. Hittar M7005 vid uppstarten en exe fil, med namn och en giltig kobination av bokstäver efter _ (understreck), kommer M7005 att kontinuerligt anropa serven via de funktionsanrop som serven måste ha. Servrar kan kodas i C++Builder från Embarcadero eller Microsofts VB.Net. 2.1 Katalogisera server i Windows register För att M7005 skall hitta serven måste den finnas med i Widows register. C++Builder Kör serven med switchen RegServer T.ex servens hela sökväg \ ServerXE_IQ.exe /RegServer VB.Net Här får man använda sig av Microsofts program T.ex: RegAsm:s hela sökväg\ \RegAsm.exe "serverns hela sökväg \ ServerVBNet_IQ.exe 2.2 Varning Eftersom en servers kod exekveras dels därför att en operatör (eller annan yttre händelse) så vill, dels genom anrop från M7005, måste man skriva sin kod med detta i minnet. Problemet illustreras med följande exempel på en _M server Antag att när servern startas har den två givare anslutna, Via Init_M(..) talar servern om för M7005 att givarvärden för två givare kommer att skickas in via Get_M(..) Antag sedan att serven är så intelligent, så om ytterligare två givare ansluts, anpassar den sig automatiskt. Servern kommer då att skicka in 4 st givarvärden via Get_M( ) men, och här är problemet, M7005 förväntar sig bara 2 st givarvärden. Vad servern måste göra är att sätta pistatus = 0x02 CONFIG_CHANDGE i Get_M(,piStatus, ) och på så sätt få M7005 att anropa Init_M( ) på nytt. I och med anropet av Init_M(..) får M7005 reda på aktuellt antal mått (4) som den skall ta emot. Innan M7005 anropat servern via Init_M( ) måste serven i Get_M( ) antingen Fortsätta med att skicka bara det gamla antalet dvs 2 givarvärden Eller med hjälp av flaggor se till att koden som skriver till in arean i Get_M( ) aldrig genomlöps samt sätta pistatus = 0x04 SERVER_NOT_READY. Exempelprogrammet ServerGenerellXR_G/ ServerGenerellVBNet_G använder sig av flaggor för att ingen konflikt skall uppstå när antalet mått som sänds till M7005 ändras. Att koda en M7005 Server 6 (40)
3 Exempel på Serverprogram Här kommer en beskrivning av de fyra exempelservrar som finns att hämta hem från hemsidan, www.metem.m7005. Exemplen finns i två versioner en för C++ Builder och en för VBNet. VBNet program bygger på det exempel, VBExeComServer, som Microsoft publicerat och finns på http://code.msdn.microsoft.com/windowsdesktop/vbexecomserver- 74ecdb1c/view/SourceCode 3.1 ServerXE_IQ / ServerVBNET_IQ Digitalt in/ut till/från M7005 Figur 3. Genom att med musen klicka på I8, I9, I10, I16, H14, H15, H16, S6 eller S13 kommer motsvarand bitar i M7005 att ändra värde. Q1, Q2, Q8, H9, H17, H24, S1 och S2 erhåller däremot sina värden från M7005 Hemlighet Om man i M1005:s bild Digital io och Hjälpflaggor figur 2 ställer musen på Ut håller nere vänster shift knapp på tangent bordet, samtidigt som man klicka på vänster musknapp, kommer Ut att bli lutande ( och om bildskärmen är i Windows Klassiskt mode att blir rödmarkerad). Gör man om proceduren, men placera nu musen på Q för 1 8 blir Q:et rött. I och med det har Q1 Q8 blivit frikopplat från M7005 eventuella uppdatering av dessa bitar. Man kan nu påverka deras värde genom att med musen klicka på dem, se figur xx nedan. En Hjälp knapp visas men det är inget att bry sig om. Klickar man t.ex på Q1 så att den blir grön i M7005, skall den också bli grön i serverns bild. Att koda en M7005 Server 7 (40)
Figur 4. Exempel på hur man kan frikoppla M7005:s Q1-Q8 från att bli uppdaterad av M7005 och i stället bli motagliga för klick från musens vänsterknapp. 3.2 ServerTransdXE_M / ServerTransdVBNet_M Serven skickar in tre stycken givarvärden som ger T2, T4 och T5 i M7005 sina värden. Man ändrar värdena genom att använda pilup/ pilner knapparna. Tar man upp M7005:s Givarvisnings bild ser man hur T2, T4 och T5 ändras Figur 5. Att koda en M7005 Server 8 (40)
3.3 ServerMetStyrXE_RS / ServerMetStyr_RS Server för mätstyrning (_S) med svar (_R). Då M7005 finner det vara dags att skicka mätsyrningsdata till serven, visa servern hela den översända informationen. Se figur 6 nedan. Datat är på xml-format Figur 6. Att koda en M7005 Server 9 (40)
Via knappen skicka svar, skickas ett svar som gör att aktuell post i databasen får en markering C som visar att serven har svarat. Normalt för mätstyrningsservrar, skickas svaret i och med att verktygsmaskinen har hämtat alla korrektörer. Figur 7. Att koda en M7005 Server 10 (40)
3.4 ServerGenerellXE_G / ServerGenerellVBNet_G Den generella demo serven har ett fönster som visas i figur 8 nedan De olika rutorna betyder Figur 8. Att koda en M7005 Server 11 (40)
Aktuellt mätprogram Mätprogramnamnet som kommer in via Init_G( ) Aktuell Batch Batchnamnet som kommer in via Init_G( ) Mätprogramnamn in till M7005 Om det mätprogram som man här skriver in finns, byter M7005 till det angivna. Detalj ID in till M7005 Beroende på vad som är markerat Direkt Detalj ID skickas direkt då man klickar på knappen skicka Aktuell dataposts detalj id fält i M7005 uppdateras Mätorden går hög Detalj id skickas då aktuellt mätprograms i M7005 mätorder går hög. Detalj id läggs i M7005:s variabel för aktuellt detalj id och när mätningen sparas i M7005:s databas kommer detalj id att läggas in i dataposten Mätorder går låg som för mätorder går hög med den skillnaden att detalj id skickas först då aktuellt mätprograms, i M7005, mätorder går låg. Status anrop GetGeneralData(..) PutGeneralData(..) Uppdateras varje gång som M7005 exekvera respektive funktion Get/Put GeneralDataWhen Meas/Regorder ändras Rutorna visar M7005 mät / reg order status då deras färg ändras av respektive funktion Måtten Checkar man In till M7005 rutan skickar servern in värdet till M7005 och om rutan inte är markerad så visas värdet som kommer från M7005. Ett tipps: Mått i M7005 som får sina värden av serven bör ha en blank (tom) måttformel, ty om mätordern är hög blir det konflikt mellan mätvärdet från servern och mätvärdet framräknat av måttformel, OBS. Måtten som får sina värden från serven, uppdateras kontinuerligt oberoende av om mätprogrammets mätorder är hög eller inte. Eventuell synkronisering med mätorden får servern lösa internt. Att koda en M7005 Server 12 (40)
4 Appendix 1 Funktionsgränssnitt Numeriska värden anges på C syntax, t.ex det decimala värde 17 skrivs 0x11 ( motsvarand i VBNet är &H11). 1.1 Namn och placering Servern skall placeras i biblioteket IoServerLib som är ett underbibliotek till biblioteket som innehåller M7005.exe. Servens exe fil skall ha namn xxxxx_yyyy.exe där xxxxx = valfritt namn yyyy = typ av server M = givarserver. Skickar in givarvärden till M7005 I = digital-in-server. Skickar in digitala värden till M7005 Q = digital-ut-server. Tar emot digitala värden utsända av M7005 S = mätstyrning (ut ) Rzzz = Svars- input. Där zzzz kan vara tom eller en liten bokstav se specen för R G = En generell server med ett antal funktioner. yyyy kan också vara en kombination av Q, I, M,S,R och G och anger om en server skall ha fler interface. Ex1 Server för Solatrons digitala givare skall heta MetemDig1_M.exe och programmet kommer att registreras i Windows register som MetemDig1_M.M3005Server. Då M7005 hittar filen MetemDig1_Metv.exe skapar den ett objekt, som innehåller de aktuella funktionerna, via vilka M7005 kan nå servern. Ex2 Server för Metem 900x skall heta Metem900x_MSIQ.exe ty Metem900x understödjer mätvärden in, mätstyrning ut och plc bytes både in och ut. Servern kommer att registreras som MetemM900x_MSIQ.M3005Server. Då M7005 hittar filen MetemM900x_MSIQ.exe skapas den ett objekt yyyyy = Varian::CreateObject( MeteM900x_MSIQ.M300Server); där yyyy är objektets namn. Vi får följande filträdsstruktur I--- M7005.exe I I I ---- IOServerLib I I I I----- MetemDig1_Metv.exe I I ---- Metem900x_MSIQ.exe I I. I Att koda en M7005 Server 13 (40)
1.2 M7005 IO-system startas När M7005:s IO-system startas anropas PutCmd( ) och alla Init () funktioner och det sker När M7005 startas Om någon server sätter pistatus = 0x0002 CONFIG_CHANGED Om man via M7005:s rullgardins meny Tillbehör/ inställningar tar fram Definiera Systemet formuläret och där klickar på någon av knapparna Verkställ eller Spara. 1.3 Alla servrar Alla funktionsanrop (undantaget PutCmd(..) har en in/ut parameter CBuilder: int* pistatus VBNet: ByRef pistatus As Integer Följande värden är definierade 0x0001 - MNG_STATUS_M900X_SERVER_FOUND Internt som ges av M900x-servern 0x0002 - CONFIG_CHANGED Om M7005 upptäcker returnkoden i en funktion, initierar M7005 alla servrar. Dvs alla Init.() funktioner anropas på samma sätt som när M7005 startades. CONFIG_CHANGEED bör sättas om servern har ändrat på variabler som är direkt berörda av kommunikationen. 0x0004 - SERVER_NOT_READY M7005 väntar under några sekunder på att serven skall bli klar. Om inte blir det time out. 0x0008 - SERVER_READY 0x0010 - DATA_OK 0x0020 - DATA_ERROR M7005 slutar polla servern och ett felmeddelande visas. 0x0040 - MASTRING_REQUIRED Servern begär en mastring av aktuellet mätprogram. Skylten Placera master i mätläge visas. 0x0080 - MEAS_STEARSERVER_FOUND Om M7005 upptäcker MEAS_STEARSERVER_FOUND ändras systemet till STSTEM_TYPE_FULL, Dvs om det finns en mätstyrserver (_S) i IoServerLib ändras M7005:s systemtyp automatiskt till Full och Full innebär att mätstyrning är tillåten. Att koda en M7005 Server 14 (40)
1.4 Kommando från M7005 till server PutCmd(int icmd) CBuilder: char PutCmd(int icmd) VBNet: Function PutCmd(ByRef icmd As Short) As Byte Obs: PutCmd( ) måste finnas med I varje Server och returnera i vilket språk som servern är kodad. icmd används ej Return 0x01 - SERVER_CODED_IN_CBUILDER 0x11 - SERVER_CODED_IN_VBNET Att koda en M7005 Server 15 (40)
1.5 Givarvärden in till M7005 (_M) En _M server måste ha både InitGet_M( ) och Get_M( ) funktionerna. 1.5.1 Initiering InitGet_M() CBuilder: InitGet_M(int* pistatus, int* pinov, VARIANT* ptv) VBNet: Function InitGet_M(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Funktionen skickar in till M7005 vilka givare (Txx) som får sina värden från servern. pistatus Om allt ok = 0x0008, se för övrigt avsnitt 1.3 pinov antalen plc byte nr som följer = antal element i arrayan ptv. ptv Innehåller en array som ser ut som nedan. Int 1 2 3 4. Givar # Givar # Givar # Givar # Givar # är ett heltal som börjar på 0. M7005 givar T6 har nr = 5. Return Funktionen skall returnera noll (0). Mera info Se exempelprogrammen ServerTransdXE_M och/eller ServerTransdVBNet_M Att koda en M7005 Server 16 (40)
1.5.2 Kontinuerligt Get_M() CBuilder: cint* pistatus, int* pinov, VARIANT* ptv) VBNet: Function Get_M(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Funktionen skickar pinov st flyttal in till M7005 som placeras som givarvärden i respektive Txx. pistatus Om allt ok = 0x0010 (DATA_OK), se för övrigt avsnitt 1.3 Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinov antal element i arrayan ptv. ptv inne håller array som ser ut som Givarvärd e 1 2 3 4. Givarvärde Givarvärde Givarvärde Givarvärdet är flyttal med decimalpunkt och eventuellt tecken. Return Funktionen skall returnera noll (0). Mer info Se exempelprogrammen ServerTarnsdXE_M och/eller ServerTransdVBNet_M Exempelprogrammet ServerTransdVBNet_M Att koda en M7005 Server 17 (40)
1.6 Digitala värde in till M7005 (_I) En _I server måste ha både InitGetPlc_I( ) och GetPlc_I( ) funktionerna definierade. 1.6.1 Initiering InitGetPlc_I() CBuilder: InitGetPlc_I(int* pistatus, int* pinov, VARIANT* ptv) VBNet: Function InitGetPlc_I(ByRef pistatus As Integer, pinov As Integer, ByRef ptv As Object) ByRef Beskrivning Servern skickar ut till M7005 vilka bitar (Ixx, Hxx, S1 S16) som servern påverkar. För att M7005 skall veta vilka bitar som får ändras, skickar servern numret på berörda byte plus en bitmask för att maska fram de enskilda bitarna. Första byten har nr 0. Dvs M7005 första in byte som rymmer I1 tom I8 är byte noll. Funktionen anropas då M7005:s IO system startas. pistatus Om allt ok = 0x0008, se för övrigt avsnitt 1.3 pinov antalen plc byte nr som följer = antal elemet i arrayan ptv / 2 ptv en array av heltal (int/integer) enligt layout nedan Heltal nr 0 1 2 3. Byte # Mask Byte # Mask Byte # är ett heltal som börjar på 0 4 för I-bytes. 1000-1005 för H-bytes och 2000 2001 för resultatbytes S1-S8, S9-S16 Mask är den mask som plc byten kommer att och:as med i M7005 för att bara utvalda bitar skall ändras. Return Skall sättas till noll (0) Mer info Se exempelprogrammen ServerXE_IQ eller ServerVBNET_IQ Att koda en M7005 Server 18 (40)
1.6.2 Kontinuerligt GetPlc_I( ) CBuilder GetPlc_I(int* pistatus, int* pinov, VARIANT* ptv) VBNet Function GetPlc_I(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Servern skickar *pinov st bytes som M7005 sedan får tilldela de plc bytes som angetts vid anropet av InitGetPlc_I( ). M7005 maskar sedan fram berörda bitar som ändras i enlighet med det som skickats i ptv arryen. Funktionen anropas kontinuerlig så länge som M7005 exekveras pistatus sätts till 0x0010 (DATA_OK) om allt OK. För övrigt se avsnitt 1.3 Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinob antalen plc bytes i arrayan ptv ptv innehålle en array som ser ut som Byten nr 0 1 2 3 4. Plc byte Plc byte Plc byte Plc byet Plc byte innehåller värdet som bitarna i M7005 skall erhålla. Return Skall sättas till noll (0) Mer info Se exempelprogrammen ServerXE_IQ eller ServerVBNET_IQ Exempelprogrammet ServerEX_IQ. Att koda en M7005 Server 19 (40)
1.7 Digitala värden ut från M7005 (_Q) En _Q server måste ha både InitPutPlc_Q( ) och PutPlc_Q( ) funktionerna. 1.7.1 Initiering InitPutPlc_Q( ) CBuilder InitPutPlc_Q(int* pistatus, int* pinov, VARIANT* ptv) VBNet Function InitPutPlc_Q(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Funktionen talar om för M7005 vilka bytes (Qxx, Hxx S1-8, S1-16) som M7005 skall skicka till servern. Första byten har nr 0. Dvs M7005 första ut byte som rymmer Q1 tom Q8 är byte noll. Funktionen anrops då M7005:s IO system startas. pistatus Om allt ok = 0x0008, se för övrigt avsnitt 1.3 pinov antal element i arrayan ptv ptv en array om ser ut som nedan Int nr 0 1 2 3. Byte # Byte # Byte # Byte # Byte # är ett heltal som börjar på 0 4 för Q-bytes. 1000-1005 för H-bytes och 2000 2001 för resultatbytes S1-S8, S9-S16 Return Skall sättas till noll (0) Mer info Se exempelprogrammen ServerXE_IQ eller ServerVBNET_IQ Att koda en M7005 Server 20 (40)
1.7.2 Kontinuerligt PutPlc_Q( ) CBuilder PutPlc_Q(int* pistatus, int inov, VARIANT* ptv) VBNet Function PutPlc_Q(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Servern tar emot pinob st bytes som M7005 skickat. Funktionen anropas så länge som M7005 exekveras pistatus sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 1.3. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. inov antalen bytes i arrayan ptv ptv innehåller en array som ser ut som Byten nr 0 1 2 3 4. Plc byte Plc byte Plc byte Plc byet Plc byte Plc byte innehåller informationen skickats av M7005. Return Skall sättas till noll (0) Mer info Se exempelprogrammen ServerXE_IQ eller ServerVBNET_IQ Exempelprogrammet ServerEX_IQ. Att koda en M7005 Server 21 (40)
1.8 Mätstyrningsdata ut från M7005 (_S) En _S server måste ha både Init_S( ) och Put_S( ) funktionerna. 1.8.1 Initiering Init_S( ) CBuilder Init_S(int* pistatus, BSTR strmeasprogpath, BSTR stroptininfo) VBNet Function Init_S(ByRef pistatus As Integer, ByVal strmeascasename As String, ByVal stroptionalinfor As String) Beskrivning Funktionen anropas förutom vi start av serversystemet också vid mätprogrambyte och batchbyte. pistatus sätts till 0x0008 (SERVER_READY) om allt OK. För övrigt se avsnitt 1.3 strmeasprogpath Innehåller sökvägen till aktuellt mätprogram på xml format. stroptininfo (kund special) Om nu aktuellt mätprogram är uppdukat på M7005:s H25 H32 bitar, finns här numret (börjar med 1) på den position som mätprogrammet har. T.ex <OptionInso> <H25-H32_Nummer>2</H25_H32_Nummer> </OptionInfo> Return Skall sättas till noll (0). Mera info Se exempelprogrammet ServerMetStyrXE_RS eller ServerMetSturVBNet_RS Att koda en M7005 Server 22 (40)
1.8.2 Kontinuerligt Put_S( ) CBuilder Put_S(int* pistatus, int* pinobytes, BSTR) VBNet Function Put_S(ByRef pistatus As Integer, ByRef pinov As Integer, ByVal pstr As String) Beskrivning När registreringsorden går låg och kraven från mätstyrningsstrategin är uppfyllda skickar M7005 mätstyrningsdata i funktionsargumentet pstr till servern. (För information om M7005:s olika mätstyrningsstrategier, se handboken Mätstyrning med M7005 ). pistatus sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 1.3. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinov Antal tecken i pstr. För unicode är ett tecken = 2 bytes. pstr Mätstyrningsdatat på xml format. Se exemplet i figur nedan. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerMetStyrXE_RS eller ServerMetSturVBNet_RS Att koda en M7005 Server 23 (40)
140916/SJn Specifikation av mätsyrningsdata som går från M7005 till mätstyrningsserven Alla Tags och värden är vanliga teckensträngar (asci) Variabel Tag Värde Anm Märprogramnamn cname Antal mått i mätprog no0meas Nolltelegram NollTelegram true false Antal mätsyrda mått iantmeassteermeas Mätresultat MeasResult WithinTol OutTol Sps resultat SpcResult XBarOver XBarUnder ROver Per mått Nrx x = måttest nummer Nominelt värde NomValue Målvärde TargetValue Axel Axel X Y Z VerktygsNr VerktygsNr Avvikels frå målv. DevFromTarget Avvikelse från nominetv. DevFromNom Mätvärder MeasValue Övre tolerans HighTolerance Undre tolerans LowTolerance Att koda en M7005 Server 24 (40)
Exempelprogrammet ServerMetStyrXE_RS Att koda en M7005 Server 25 (40)
1.9 Svar in till M7005 (_R) En _R server måste innehålla både Init_R( ) och Get_R( ) funktionerna. 1.9.1 Initiering Init_R( ) CBuilder Init_R(int* pistatus, BSTR strmeasprogname, BSTR strmeasprogpath, BSTR stroptininfo) VBNet Function Init_R(ByRef pistatus As Integer, ByVal strmeascasename As String, ByVal strmeasprogpath As String, ByVal stroptionalinfor As String) Beskrivning Funktionen anropas förutom vi start av serversystemet också vid mätprogrambyte och batchbyte. pistatus sätts till 0x0008 (SERVER_READY) om allt OK. För övrigt se avsnitt 1.3 strmeasprogname Namnet på mätprogrammet strmeasprogpath Fullständig sökväg till mätprogrammet på xml format. stroptininfo Används ej Return Skall sättas till noll (0). Mera info Se exempelprogrammet ServerMetStyrXE_RS eller ServerMetSturVBNet_RS Att koda en M7005 Server 26 (40)
1.9.2 Kontinuerligt Get_R( ) CBuilder Get_R(int* pistatus, int* pinobytes, BSTR* pstr) VBNet Function Get_R(ByRef pistatus As Integer, ByRef pinobytes As Integer, ByRef pstr As String) Beskrivning Funktionen anropas kontinuerligt så länge som M7005 exekveras. pistatus sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 21.3. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinobytes Antal bytes i pstr pstr En sträng på xml format som ser ut som nedan <?cml version= 1.0 encoding= UTF-8 standalone= yes?> <CompensationsColected>XXX</CompensationsColected> Om XXX sätts = Yes kommer en C markering att göras i aktuell data post som ett tecken på att mätstyrningsdatat är hämtat av verktygsmaskinen. För mer information om M7005:s databas och markeringar i den se handboken M7005 filer, bibliotek, databasstruktur. Om XXX sätts = No sker ingenting. <WriteMsgToM7005SystemLog>asLogMsg</WriteMsgToM7005SystemLog> Innehållet i aslogmsg ( som är en AnsiString) skrivs in i M7005:s systemlogg. OBS: M7005 skriver inte tomma (aslogmsg har längd = 0) till loggen. Så för att inte fylla loggen med samma meddelande måste man sätta aslogmsg = efter det att man kopierat in aslogmsg:s innehåll till pstr Från exempel serverb ServerMetSryrXE:SR void fastcall TfrmGet_RForm::CreateGet_R_Reply(AnsiString _asyesno, AnsiString _asm7005loggmsg) { // skapar asget_rreply som skickass till M7005 asget_rreply="<?cmlversion=\"1.0 \" encoding=\"utf-8\" standalone= \"yes \"?>\n"; asget_rreply += "<CompensationsColected>"; asget_rreply += _asyesno; asget_rreply += "</CompensationsColected>\n"; asget_rreply += "<WriteMsgToM7005SystemLog>"; asget_rreply += _asm7005loggmsg; asget_rreply += "</WriteMsgToM7005SystemLog>"; } Att koda en M7005 Server 27 (40)
Return Funktionen skall returnera noll (0) Special a - dvs _Ra Till R kan läggas bokstaven a så när M7005 går I genom R:s funktioner och a är satt anropas funktionen nedan Put_RaDataWhenMeasOrderGoesHigh() När mätorden går hög för aktuellt mätprogram anropas denna funktion (tillkomsten motiverad av IBRMultiConfigFile server för INDEX projektet 121120). Mera info Se exempelprogrammet ServerMetStyrXE_RS eller ServerMetSturVBNet_RS Exempelprogrammet ServerMetStyrXE_RS Att koda en M7005 Server 28 (40)
1.10 Generell server (_G) En _G server måste innehålla samtliga funktioner beskrivna i detta avsnitt 1.10.1 Initiering Init_G() CBuilder Init_G(int* pistatus, int* pinov, VARIANT* ptv, BSTR strmeascasepath) VBNet Init_G(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object, ByVal strmeascasepath As String) Beskrivning Funktionen anropas förutom vi start av serversystemet också vid mätprogrambyte och batchbyte. Servern tar emot vilket mätprogram som nu är aktuellt och skickar vilka mått som sätts av serven. pistatus sätts till 0x0008 (SERVER_READY) om allt OK. För övrigt se avsnitt 1.3 pinobytes Antal mått nummer som följer ptv = skall innehålla numren på de mått vilka serven skall ge mätvärden. Int 1 2 3. Mått # Mått # Mått # Mått # är ett heltal som börjar på 1. (OBS börjar på 1) M7005 kommentar Mått som får sina mätvärden från serven bör inte ha någon måttformel i M7005. Dvs fältet för måttets måttformel skall vara tom. Om inte uppstår konflikt mellan måttformels beräknade värde och det värde som kommer från servern. strmeascasepath en sträng på xml format som innehåller den kompletta sökvägen till nu aktuellt mätprograms xml fil. Tag för sökvägen är <spathtocurrentmeasprog>. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 29 (40)
1.10.2 Kontinuerlig Funktionerna anropas kontinuerligt så länge som M7005 exekveras Get_MeasV() CBuilder Get_MeasV(int* pistatus, int* pinov, VARIANT* ptv) VBNet Get_MeasV(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Funktionen skickar mätvärden för de måtten som angivits i Init_G, in till M7005. pistatus Sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 1.3. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinov Antal mätvärden i ptv ptv En array som innehåller de mätvärden som motsvarande mått i M7005 erhåller. Flyttal double 1 2 3 4. Mätvärde Mätvärde Mätvärde Mätvärde All information i arrayen är flyttal (double) och hur många mätvärden ptv innehåller finns i heltalet *pinov. Mätvärdet är flyttal med decimalpunkt och eventuellt tecken. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 30 (40)
Put_MeasV() CBuilder Put_MeasV(int* pistatus, int* pinov, VARIANT* ptv) VBNet Function Put_MeasV(ByRef pistatus As Integer, ByRef pinov As Integer, ByRef ptv As Object) Beskrivning Funktionen skickar ut M7005.s mätvärden för mätprogrammet samtliga mått, in till servern. pistatus Sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 2.1. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinov Antal mätvärden i ptv. Dvs antalet mått i mätprogrammet ptv En array som innehåller de mätvärden som motsvarande mått i M7005 erhåller. Flyttal double 1 2 3 4. Mätvärde Mätvärde Mätvärde Mätvärde Mätvärdet är flyttal med decimalpunkt och eventuellt tecken. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 31 (40)
Get_GeneralData( ) CBuilder Get_GeneralData(int* pistatus, int* pinobytes, BSTR* pstr) VBNet Get_GeneralData(ByRef pistatus As Integer, ByRef pinobytes As Integer, ByRef pstr As String) Beskrivning Funktionen hämtar in information in till M7005 pistatus Sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 2.1. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. pinobytes antal bytes i pstr. pstr En sträng med information på xml-format. Data som avkodas nu är mätprogramnamn och detalj ID. Automatiskt byte av mätprogram i M7005 Mätprogramnamn har tag <GetMeasCaseNameFromServer> och om det finns ett namn angivet, byter M7005 mätprogram till det angivna Ge detalj ID Detalj ID har tag <GetDetaljIDFromServer> om det finns ett id angivet, läggs det i senaste registrerade detaljens data post. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 32 (40)
Put_GeneralData( ) CBuilder Put_GeneralData(int* pistatus, int inobytes, BSTR str) VBNet Put_GeneralData(ByRef pistatus As Integer, ByVal inobytes As Integer, ByVal str As String) Beskrivning Funktionen skickar ut information till serven pistatus Sätts till 0x0010 (DATA_OK). För övrigt se avsnitt 2.1. Om pistatus innehåller 0x02 (CONFIG_CHANGE) anropar M7005 servens Init() funktion omedelbart. Inga åtgärder på grund av innehållet i övriga parametra kommer att genomföras. inobytes antal bytes i str. str En sträng på xml format. Strängen innehåller för närvarand ingen information Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 33 (40)
1.10.3 Vid behov Funktionerna nedan anropas bara då deras speciella villkor är uppfyllda Get_GeneralDataWhenMeasOrderGoesHigh() CBuilde Get_GeneralDataWhenMeasOrderGoesHigh(int* pistatus, int* pinobytes, BSTR* pstr) VBNet Get_GeneralDataWhenMeasOrderGoesHigh(ByRef pistatus As Integer, ByRef pinobytes As Integer, ByRef pstr As String) Beskrivning Funktionen hämtar in information in till M7005 då mätorden går hög pistatus sätts till 0x0010 (DATA_OK). pinobytes antal bytes i pstr. pstr En sträng på xml-format som kan innehålla ett detalj ID Detalj id har tag <GetDetaljIDFromServer>. Om ett detalj id skickas så lägger M7005 det i sin area för aktuellt detalj id. När sedan mätningen sparas kommer dess id fält att innehålla det från servern skickade detalj idet. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 34 (40)
Get_GeneralDataWhenMeasOrderGoesLow() CBuilder Get_GeneralDataWhenMeasOrderGoesLow(int* pistatus, int* pinobytes, BSTR* pstr) VBNet Get_GeneralDataWhenMeasOrderGoesLow(ByRef pistatus As Integer, ByRef pinobytes As Integer, ByRef pstr As String) Beskrivning Funktionen hämtar information in till M7005 då mätorden går låg. pistatus sätts till 0x0010 (DATA_OK). pinobytes antal bytes i pstr. pstr En sträng på xml-format som kan innehålla ett detalj ID Detalj id har tag <GetDetaljIDFromServer>. Om ett detalj id skickas så lägger M7005 det i sin area för aktuellt detalj id. När sedan mätningen sparas kommer dess id fält att innehålla det från servern skickade detalj idet. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 35 (40)
Put_GeneralDataWhenMeasOrderGoesHigh() CBuilder Put_GeneralDataWhenMeasOrderGoesHigh(int* pistatus, int inobytes, BSTR str) VBNet Put_GeneralDataWhenMeasOrderGoesHigh(ByRef pistatus As Integer, ByVal inobytes As Integer, ByVal str As String) Beskrivning Funktionen skickar ut information till serven då mätorden går hög. pistatus sätts till 0x0010 (DATA_OK). inobytes Antal bytes i str. str En sträng på xml format. Strängen innehåller för närvarand ingen information Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 36 (40)
Put_GeneralDataWhenMeasOrderGoesLow() CBuilder Put_GeneralDataWhenMeasOrderGoesLow(int* pistatus, int inobytes, BSTR str) VBNet Put_GeneralDataWhenMeasOrderGoesLow(ByRef pistatus As Integer, ByVal inobytes As Integer, ByVal str As String) Beskrivning Funktionen skickar ut information till serven då mätorden går låg. pistatus sätts till 0x0010 (DATA_OK). inobytes antal bytes i str. str En sträng på xml format. Strängen innehåller för närvarand ingen information Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Att koda en M7005 Server 37 (40)
Put_GeneralDataWhenRegOrderGoesLow() CBuilder Put_GeneralDataWhenRegOrderGoesLow(int* pistatus, int inobytes, BSTR str) VBNet Put_GeneralDataWhenRegOrderGoesLow(ByRef pistatus As Integer, ByVal inobytes As Integer, ByRef str As String) Beskrivning Funktionen skickar ut information till serven då registreringsorden går låg pistatus sätts till 0x0010 (DATA_OK). inobytes Antal bytes i str. str En sträng på xml format som innehåller det i M7005 aktuella detalj idet. Detalj ID har tag <PutDetaljIDToServer>.. Return Funktionen skall returnera noll (0) Mera info Se exempelprogrammet ServerGenerellXE_G eller ServerGenerellVBNet_G Exempelprogrammet ServerGenerellVBNet_G Att koda en M7005 Server 38 (40)
5 Appendix 2 Skapa VBNet projekt Att skapa ett VBNet Com projekt utifrån ett redan existerande. Grund projektet är Microsofts VBExeComServer se http://code.msdn.microsoft.com/windowsdesktop/vbexecomserver-74ecdb1c/view/sourcecode Gör följande Skapa ett nytt VBNet projekt Console Application OBS måste sättas rätt Project / Propertis sätt som nedan Att koda en M7005 Server 39 (40)
Add Existing M3005Server.vb, COMHelper.vb, Main_Module.VB, NativeModule.vb Spara modulerna i rätt bibliotek (de verkar redan finnas Add existings Projectxxxx_yyy.vb Byt namn överallt i filen via Edit/ Find Replace Spara Lägg in ServerTransdVBNet_M.Instance.Run() i MainModule Lägg till frmmainform Editer in rätt COM interface Sätt Startup obbject till MainModule Generera nya GIUD och stopp in den i M3005Server.vb Editer in <PropertyGroup> <PostBuildEvent>echo Generate and register type library. C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /tlb "$(TargetPath)" echo Register the component. C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "$(TargetPath)"</PostBuildEvent> </PropertyGroup> I projektfilen.vbproj Att koda en M7005 Server 40 (40)