<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Protokół ADAM-ASCII - czyli prosta implementacja protokołu komunikacyjnego w modułach pomiarowych ADAM</title>
<meta name="keywords" content="Moduły pomiarowe kontrolno-pomiarowe moduł pomiarowy kontrolno-pomiarowy ADAM USB I/O Advantech">
<meta name="description" content="Moduły pomiarowe kontrolno-pomiarowe moduł pomiarowy kontrolno-pomiarowy ADAM USB I/O Advantech">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
<meta name="author" content="Jacek Bonecki - Elmark Automatyka Sp. z o.o. - http://www.elmark.com.pl">
<meta name="verify-v1" content="dFPC/7SMwqEjaoI9PbBxgMy61Tm7deLBY7wDvMEdY3E=">
<style type="text/css">
<!--
a:HOVER{TEXT-DECORATION:UNDERLINE;}
a {TEXT-DECORATION:none}
.vlrbt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vrbt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vlbt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vlrt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;}
.vlrb {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;}
.vlr {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;}
.vbt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vrb {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;}
.vrt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vlb {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;}
.vlt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.vl {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-LEFT-WIDTH:1px;BORDER-LEFT-STYLE:solid;BORDER-LEFT-COLOR:#C0C0C0;}
.vr {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-RIGHT-WIDTH:1px;BORDER-RIGHT-STYLE:solid;BORDER-RIGHT-COLOR:#C0C0C0;}
.vb {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-BOTTOM-WIDTH:1px;BORDER-BOTTOM-STYLE:solid;BORDER-BOTTOM-COLOR:#C0C0C0;}
.vt {FONT-FAMILY:Tahoma;FONT-SIZE:10px;BORDER-TOP-WIDTH:1px;BORDER-TOP-STYLE:solid;BORDER-TOP-COLOR:#C0C0C0;}
.v {FONT-FAMILY:Tahoma;FONT-SIZE:10px;}
.myframe {FONT-FAMILY:Tahoma;FONT-SIZE:10px;PADDING-RIGHT:10px;PADDING-LEFT:10px;PADDING-BOTTOM:0px;PADDING-TOP:0px;}
.myframe SPAN.CTOP {MARGIN:0px -10px}
.myframe SPAN.CBOT {MARGIN:0px -10px}
SPAN.CTOP {DISPLAY:BLOCK;FONT-SIZE:1px;LINE-HEIGHT:1px;BACKGROUND-REPEAT:no-repeat;HEIGHT:5px}
SPAN.CBOT {DISPLAY:BLOCK;FONT-SIZE:1px;LINE-HEIGHT:1px;BACKGROUND-REPEAT:no-repeat;HEIGHT:5px}
SPAN.CTOP SPAN {DISPLAY:BLOCK;FONT-SIZE:1px;LINE-HEIGHT:1px;BACKGROUND-REPEAT:no-repeat;HEIGHT:5px}
SPAN.CBOT SPAN {DISPLAY:BLOCK;FONT-SIZE:1px;LINE-HEIGHT:1px;BACKGROUND-REPEAT:no-repeat;HEIGHT:5px}
SPAN.CTOP {BACKGROUND-POSITION:0px 0px;BACKGROUND-IMAGE:none;MARGIN:0px -5px}
SPAN.CTOP SPAN {BACKGROUND-POSITION:100% 0px;BACKGROUND-IMAGE:none}
SPAN.CBOT {CLEAR:both;BACKGROUND-POSITION:0px 100%;BACKGROUND-IMAGE:none;MARGIN:0px -5px}
SPAN.CBOT SPAN {BACKGROUND-POSITION:100% 100%;BACKGROUND-IMAGE:none}
SPAN.CTOP {BACKGROUND-IMAGE:URL(IMG/C1.PNG)}
SPAN.CTOP SPAN {BACKGROUND-IMAGE:URL(IMG/C2.PNG)}
SPAN.CBOT {BACKGROUND-IMAGE:URL(IMG/C3.PNG)}
SPAN.CBOT SPAN {BACKGROUND-IMAGE:URL(IMG/C4.PNG)}
-->
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#000080" vlink="#000080" alink="#000080" leftmargin="10" topmargin="10">
<table align=center width=1000 bgcolor=#000080 cellpadding=0 cellspacing=0 border=0><tr><td align=left><a href=/><img src=img/top.jpg border=0 width=800 height=65></a></td></tr></table>
<table align=center width=1000 border=0 cellpadding=5 cellspacing=0 style="font-family:tahoma;font-size:10px;"><tr>
<td width=1 valign=top align=center class=vlrbt>
<a target=_blank href=http://www.elmark.com.pl/products/advantech/grupa.php?grupa=1><img src=img/elmark.gif width=200 height=66 border=0 alt="Elmark Automatyka Sp. z o.o."></a><br>
<img src=img/blank.gif width=200 height=5><table cellpadding=3 cellspacing=0 width=200 style="font-family:tahoma;font-size:10px;">
<tr><td bgcolor=#000080><b><font color=#FFFFFF>Menu...</font></b></td></tr>
</table>
<table cellpadding=3 cellspacing=0 width=200 class=vlrb>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=0>Strona główna</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=1>O nas: Elmark Automatyka Sp. z o.o.</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=http://www.elmark.com.pl/forum/ target=_blank>Nasze forum</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=2>Inne/ciekawe strony www</a></td></tr>
</table>
<img src=img/blank.gif width=200 height=5><table cellpadding=3 cellspacing=0 width=200 style="font-family:tahoma;font-size:10px;">
<tr><td bgcolor=#000080><b><font color=#FFFFFF>Artykuły...</font></b></td></tr>
</table>
<table cellpadding=3 cellspacing=0 width=200 class=vlrb>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=101>P2P i GCL w serii ADAM-6000</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=102>Seria EKI-122X - konwertery Modbus</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=103>WIRE-CHIP, JAZZ i moduły ADAM</a></td></tr>
</table>
<img src=img/blank.gif width=200 height=5><table cellpadding=3 cellspacing=0 width=200 style="font-family:tahoma;font-size:10px;">
<tr><td bgcolor=#000080><b><font color=#FFFFFF>O czym warto wiedzieć...</font></b></td></tr>
</table>
<table cellpadding=3 cellspacing=0 width=200 class=vlrb>
<tr><td bgcolor=#FFFF9F>Protokół ADAM-ASCII</td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=202>Protokół Modbus</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=203>Implementacja Modbus/RTU</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=204>Implementacja Modbus/TCP</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=205>Wyjścia przekaźnikowe</a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=206>Seria ADAM-6000 i język PHP</a></td></tr>
</table>
<img src=img/blank.gif width=200 height=5><table cellpadding=3 cellspacing=0 width=200 style="font-family:tahoma;font-size:10px;">
<tr><td bgcolor=#000080><b><font color=#FFFFFF>Najpopularniejsze modele...</font></b></td></tr>
</table>
<table cellpadding=3 cellspacing=0 width=200 class=vlrb>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=301>ADAM-4520<font color=#BBBBBB> Optoizolowany<br>konwerter RS-232/422/485</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=302>ADAM-4017+<br><font color=#BBBBBB>Wejścia analogowe (RS-485)</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=303>ADAM-4055<br><font color=#BBBBBB>We/wy cyfrowe (RS-485)</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=304>ADAM-5000/TCP<br><font color=#BBBBBB>Kaseta Modbus/TCP</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=305>ADAM-6017<br><font color=#BBBBBB>Wejścia analogowe</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=306>ADAM-6060<br><font color=#BBBBBB>We/wy cyfrowe (przekaźnikowe)</font></a></td></tr>
<tr><td bgcolor=#F4F4F4 onmouseover="this.style.backgroundColor='#CADCEB'" onmouseout="this.style.backgroundColor='#F4F4F4'"><a href=307>USB-4711A<font color=#BBBBBB> Uniwersalny<br>moduł pomiarowy AI/AO/DI/DO</font></a></td></tr>
</table>
</td>
<td valign=top align=center class=vrbt>
<table width=100% cellpadding=20 cellspacing=0 border=0 style="font-family:tahoma;font-size:12px;">
	<tr>
	<td> 
	<div class="myframe" style="FONT-SIZE:14px;BACKGROUND-COLOR:#EBF3F8;COLOR:#000080;">
	<span class="ctop"><span></span></span>
	<b>Protokół ADAM-ASCII</b><br>Czyli prosta implementacja protokołu komunikacyjnego
	<span class="cbot"><span></span></span>
	</div>
	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Komunikacja modułów serii ADAM-4000/5000 wyposażonych w interfejs RS-485 z innymi urządzeniami pełniącymi
	funkcje jednostek nadrzędnych w systemie pomiarowym oparta jest w głównej mierze o prosty protokół w formacie
	komend ASCII opracowany przez producenta (wszystkie moduły wejść/wyjść w serii ADAM-4000 oraz kasety
	komunikacyjne bez wbudowanych kontrolerów w serii ADAM-5000 wyposażone w port szeregowy RS-485). Każda z komend
	protokołu składa się praktycznie z czterech części:<br>
	<br>
	&#8226; znak początku,<br>
	&#8226; adres modułu,<br>
	&#8226; kod komendy,<br>
	&#8226; znak kończący.<br>
	<br>
	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Znakiem poczatku jest zazwyczaj <b>$</b> lub <b>#</b>. Adres modułu (do którego wysyłamy komendę) określany
	jest za pomocą dwóch znaków odpowiadających reprezentacji jego adresu w systemie szesnastkowym (wymagane są
	duże litery). W zależności od typu komendy, jej kod składa się z jednego do kilku znaków. Znakiem kończącym
	jest zawsze znak powrotu karetki &lt;cr&gt;=<b>0x13</b>. W przypadku odpowiedzi sytuacja jest podobna. Rozpoczyna się
	znakiem potwierdzenia (jest to zazwyczaj <b>></b> lub <b>!</b>), po którym występuje (np. w przypadku odpowiedzi
	na komendy typu "Read...") wartość zwracana przez moduł, a kończy się także znakiem powrotu karetki.<br>
	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Specyfikacja całości protokołu zawiera łącznie kilkadziesiąt komend (wśród których występują te odpowiedzialne
	za samą konfigurację i diagnostykę sprzętu oraz komendy wykorzystywane już podczas samej pracy modułów) i została
	oczywiście zawarta w instrukcji użytkownika sprzętu. Kilka przykładów zawarto w poniższej tabeli:<br>
	<br>
	<table cellpadding=2 cellspacing=0>
	<tr align=middle style="BACKGROUND-COLOR:#FFFF9F;COLOR:#000000;FONT-WEIGHT:bold;">
	<td width=130 class=vlrbt>Typ komendy</td>
	<td width=130 class=vrbt>Format zapytania</td>
	<td width=130 class=vrbt>Format odpowiedzi</td>
	<td width=130 class=vrbt>Przykład zapytania</td>
	<td width=130 class=vrbt>Przykład odpowiedzi</td>
	</tr>
	<tr valign=top><td class=vlrb>Read Module Name</td><td class=vrb>$AAM&lt;cr&gt;</td><td class=vrb>!AA(ModuleName)&lt;cr&gt;</td><td class=vrb>$01M&lt;cr&gt;<br>$02M&lt;cr&gt;</td><td class=vrb>!014017P&lt;cr&gt;<br>!024055&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>Read Firmware Version</td><td class=vrb>$AAF&lt;cr&gt;</td><td class=vrb>!AA(Version)&lt;cr&gt;</td><td class=vrb>$01F&lt;cr&gt;<br>$02F&lt;cr&gt;</td><td class=vrb>!01A2.02&lt;cr&gt;<br>!02A2.04&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>Read Conf. Status</td><td class=vrb>$AA2&lt;cr&gt;</td><td class=vrb>!AATTCCFF&lt;cr&gt;</td><td class=vrb>$012&lt;cr&gt;</td><td class=vrb>!01FF0600&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>Set Configuration</td><td class=vrb>%AANNTTCCFF&lt;cr&gt;</td><td class=vrb>!AA&lt;cr&gt;</td><td class=vrb>%0112050600&lt;cr&gt;</td><td class=vrb>!12&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>...</td><td class=vrb>...</td><td class=vrb>...</td><td class=vrb>...</td><td class=vrb>...</td></tr>
	<tr valign=top><td class=vlrb>Read Analog Input</td><td class=vrb>#AAN&lt;cr&gt;</td><td class=vrb>&gt;(data)&lt;cr&gt;</td><td class=vrb>#010&lt;cr&gt;</td><td class=vrb>&gt;+04.416&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>Digital Data In</td><td class=vrb>$AA6&lt;cr&gt;</td><td class=vrb>!(dataout)(datain)00&lt;cr&gt;</td><td class=vrb>$026&lt;cr&gt;</td><td class=vrb>!FCFC00&lt;cr&gt;</td></tr>
	<tr valign=top><td class=vlrb>Digital Data Out</td><td class=vrb>#AABB(data)&lt;cr&gt;</td><td class=vrb>&gt;&lt;cr&gt;</td><td class=vrb>#02003A&lt;cr&gt;</td><td class=vrb>&gt;&lt;cr&gt;</td></tr>
	</table>
	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Wymieniona na pierwszym miejscu komenda &quot;<b>Read Module Name</b>&quot; jest najprostszą, bardzo ważną i pomocną komendą, pozwalającą
	na sprawdzenie poprawności komunikacji z danym modułem. Wykorzystywana jest także np. przez program narzędziowy Adam Utility
	do wyszukiwania wszystkich modułów (z aktywowanym protokołem ADAM-ASCII) włączonych do danej sieci RS-485. Komendą dość rozbudowaną
	jest np. ostatnia z wymienionych - &quot;<b>Digital Data Out</b>&quot;, więc dla przykładu przeanalizujemy jej strukturę. Dokładny opis
	komendy znajdujemy oczywiście w dokumentacji do serii ADAM-4000:<br>
	<br>
	<div class="myframe" style="FONT-SIZE:12px;BACKGROUND-COLOR:#DCDCDC;COLOR:#000000;">
	<span class="ctop"><span></span></span>
	&#8226; <b>#</b> is a delimiter character.<br>
	&#8226; <b>AA</b> (range 00-FF) represents the 2-character hexadecimal address of the output value.<br>
	&#8226; <b>BB</b> is used to indicate whether all channels will be set or a single channel will be set. In the last case, BB will also
	indicate which channel it is. Writing data (a byte) to all channels should make both characters to be zero (BB=00). Writing data (a bit)
	to a single channel; however, will make the first character 1 and the second character ranging from 0 to B. The second character indicates
	the channel number.<br>
	&#8226; <b>(data)</b> is the hexadecimal representation of the digital output value(s). Two characters are for ADAM-4050, 4055, 4060 and
	4068. Four characters are for ADAM-4056S and 4056SO.<br>
	<span class="cbot"><span></span></span>
	</div>
	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Okazuje się więc, że wygenerowanie odpowiedniej zawartości komendy nie jest wcale aż tak skomplikowane. Pierwszy znak musi być znakiem
	rozpoczynającym <b>#</b>. Dwa kolejne znaki muszą reprezentować adres modułu w formacie heksadecymalnym (np. <b>21</b> dla modułu o adresie
	33). Dwa kolejne znaki określają czy chcemy zapisać całą paczkę danych, czy tylko jeden bit. A ostatnie znaki (2 lub 4 - w zależności od
	ilości wyjść cyfrowych w danym module; przed kończącym komendę znakiem powrotu karetki) reprezentować muszą heksadecymalną wartość
	odpowiadającą wymuszanemu stanowi wyjść cyfrowych. I tak na przykład:<br>
	<br>
	&#8226; <b>#140005&lt;cr&gt;</b> - to zapis wartosci 05h (00000101, odpowiednio dla wszystkich wyjść CH7&divide;Ch0) w module o adresie 20,<br>
	&#8226; <b>#211201&lt;cr&gt;</b> - to zapis wartości 01 (ustawienie stanu wysokiego) dla wyjścia CH2 w module o adresie 33.<br>
	<br>
	<div class="myframe" style="FONT-SIZE:12px;BACKGROUND-COLOR:#DCDCDC;COLOR:#000000;">
	<span class="ctop"><span></span></span>
	<b>UWAGA</b>: Opisywany protokół umożliwia także korzystanie z sumy kontrolnej. Zgodnie z dokumentacją producenta:
	<font color=#0000FF>&quot;The checksum is represented by a 2-character ASCII hexadecimal format and is transmitted just prior to the
	carriage return. The checksum equals to the result after performing modulus-256 (100h) of all the ASCII values sum preceding
	the checksum. If the checksum is missing or incorrect, the module will not respond.&quot;</font> Jeżeli chcemy skorzystać z tej możliwości to:<br>
	<br>
	&#8226; sumę kontrolną musimy włączyć przy konfiguracji danego modułu (ta opcja tylko w trybie INIT),<br>
	&#8226; i oczywiście dwa znaki reprezentujące tę sumę kontrolną dodawać musimy do każdej wysyłanej komendy.<br>
	<br>
	Algorytm jej generowania jest bardzo prosty - przykładowa implementacja w języku Pascal/Delphi może wyglądać następująco:<br>
	<br>
	function <b>ADAMCHECKSUM</b>(komenda:string):byte;<br>
	var i,suma:integer;<br>
	begin<br>
	&nbsp;&nbsp;&nbsp;suma:=0;<br>
	&nbsp;&nbsp;&nbsp;for i:=1 to length(komenda) do suma:=suma+ord(komenda[i]);<br>
	&nbsp;&nbsp;&nbsp;suma:=suma mod 256;<br>
	&nbsp;&nbsp;&nbsp;ADAMCHECKSUM:=suma;<br>
	end;<br>
	<span class="cbot"><span></span></span>
	</div>


	<p align=justify>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	Korzystając z opisu protokołu zawartego w dokumentacji do modułów ADAM, komunikację z urządzeniami można więc
	implementować we własnym zakresie w oparciu o bezpośrednią obsługę łącza szeregowego (zarówno w przypadku współpracy
	modułów z komputerem, jak i innym urządzeniem typu sterownik PLC itp). W przypadku komunikacji modułów kontrolno-pomiarowych
	z komputerem wykorzystać można także bezpłatne biblioteki dll dostarczane przez producenta. W tym celu należy:<br>
	<br>
	&#8226; zainstalować pakiet menadżera urządzeń (<b>devmgr.exe</b>),<br>
	&#8226; zainstalować pakiet bibliotek (<b>adamdll.exe</b>),<br>
	&#8226; opcjonalnie: zainstalować pakiet przykładowych programów (<b>examples.exe</b>),<br>
	&#8226; w konfiguracji urządzeń dodać i odpowiednio skonfigurować:<br>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8226; port szeregowy,<br>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8226; podłączone do niego moduły pomiarowe,<br>
	&#8226; w tworzonej aplikacji wykorzystać odpowiedni plik nagłówkowy (np. w przypadku Delphi będzie to <b>driver.pas</b>),<br>
	&#8226; wykorzystać odpowiednie funkcje biblioteczne do obsługi sprzętu.<br>
	<p align=justify>
	Przykładowy kod programu (Delphi) pozwalający na opdczyt wejścia analogowego będzie bardzo prosty:
	<br>
	<br>
	<div class="myframe" style="FONT-SIZE:12px;BACKGROUND-COLOR:#DCDCDC;COLOR:#000000;">
	<span class="ctop"><span></span></span>
	<b>DRV_SelectDevice</b>(Handle,true,DeviceNumber,@szbuffer[0]);<br>
	<b>DRV_DeviceOpen</b>(DeviceNumber,DeviceHandle);<br>
	ptAIVoltageIn.chan:=0;<br>
	ptAIVoltageIn.voltage:=@Voltage;<br>
	<b>DRV_AIVoltageIn</b>(DeviceHandle,ptAIVoltageIn);<br>
	<b>DRV_DeviceClose</b>(DeviceHandle);<br>
	<span class="cbot"><span></span></span>
	</div>
	<p align=justify>
	Czyli polegać będzie praktycznie tylko na:<br>
	<br>
	&#8226; wyborze urządzenia,<br>
	&#8226; otwarciu urządzenia,<br>
	&#8226; odczycie wejścia,<br>
	&#8226; zamknięciu urządzenia.<br>
	</td>
	</tr>
</table><br><div align=left class="myframe" style="WIDTH:738px;FONT-SIZE:11px;BACKGROUND-COLOR:#EBF3F8;COLOR:#000080;">
<span class="ctop"><span></span></span>
<b>Jeśli masz jakieś uwagi - możesz dodać swój komentarz do tej strony.</b><br>
<font color=#9EC5DE>Możesz go dopisać anonimowo - ale oczywiście lepiej by było, gdyby czytający wiedzieli kto jest jego autorem.
W przypadku wykrycia treści niedozwolonych lub nic konkretnego do tematu nie wnoszących, wpis może być w późniejszym czasie usunięty (ocenzurowany) przez administratora.</font><br>
<br><table cellpadding=2 cellspacing=0 border=0><form name=fn1 method=post>
<input type=hidden name=fv0 value="201">
<input type=hidden name=fv5 value="8a24d39a053307434c41428366bc0f96">
<tr valign=middle><td class=v width=90><b>Autor:</b></td><td>&nbsp;&nbsp;&nbsp;<input maxlength=30 class=vlrbt type=text name=fv1 value="" style="width:200px;BACKGROUND-COLOR:#FFFFFF;"></td><td rowspan=2>&nbsp;</td><td rowspan=2><img src=img/sesssecimg.php width=140 height=35 style="BORDER-WIDTH:1px;BORDER-STYLE:dotted;BORDER-COLOR:#C0C0C0;"></td></tr>
<tr valign=middle><td class=v><b>Firma:</b></td><td>&nbsp;&nbsp;&nbsp;<input maxlength=30 class=vlrbt type=text name=fv2 value="" style="width:200px;BACKGROUND-COLOR:#FFFFFF;"></td></tr>
<tr valign=middle><td class=v><b>Twój e-mail:</b></td><td>&nbsp;&nbsp;&nbsp;<input maxlength=30 class=vlrbt type=text name=fv3 value="" style="width:200px;BACKGROUND-COLOR:#FFFFFF;"></td><td class=v width=90><b>Kod z obrazka</b>:</td><td><input maxlength=8 class=vlrbt type=text name=fv6 style="width:100px;BACKGROUND-COLOR:#FFFFFF;"></td></tr>
<tr valign=top><td class=v><b>Komentarz:</b></td><td colspan=3>&nbsp;&nbsp;&nbsp;<textarea maxlength=30 class=vlrbt name=fv4 style="width:620px;height:100px;BACKGROUND-COLOR:#FFFFFF;"></textarea></td></tr>
<tr valign=top><td class=v colspan=4><input class=vlrbt type=button onClick="javascript:WriteComment()"value=Wyślij style="WIDTH:70px;"></td></tr>
</form>
</table><span class="cbot"><span></span></span>
</div><table cellpadding=0 cellspacing=0><tr><td><img src=img/blank.gif width=10 height=3 border=0></tr></td></table>
<script language="JavaScript" type="text/javascript">
<!--
function WriteComment()
{
if (document.fn1.fv6.value.length!=8) {alert('Przepisz kod zabezpieczający - w postaci ośmiocyfrowej liczby - z umieszczonego w formularzu obrazka.');return;};
if (isNaN(document.fn1.fv6.value)) {alert('Kod zabezpieczający jest ośmiocyfrową liczbą - więc może się składać tylko z cyfr.');return;};
if (document.fn1.fv6.value<0) {alert('Kod zabezpieczający jest ośmiocyfrową liczbą większą od 0.');return;};
if (document.fn1.fv4.value.length<15) {alert('Jakiś komentarz wpisać musisz - przyjmijmy, że będzie to minimum 15 znaków.');return;};
if (document.fn1.fv4.value.length>1024) {alert('Długość komentarza nie może przekaczać 1024 znaków!');return;};
document.fn1.submit();
}
// -->
</script>
</td>
</tr></table><br><br>
</body>
</html>

