Bonjour,
J'utilise PHPMODBUS pour récupérer des données sur un automate.
J'ai paramétré mes fichiers fc3.php et modbusmaster.php. La requête est envoyée et une réponse est donnée par l'automate.
Jusque là tout va bien.
Mon paquet de réponse retourné est: 2a190000000764030403b60001
Les informations qui m'intéresse sont: 03b6 00 01
Sauf que le script me sort: 03 b6 00 01. Ce qui ne donne pas la même chose: 3b6=950 et b6=182. la valeur juste est 03b6
A priori, ca me semblait assez simple à résoudre...mais non; je voulais associer 03 et b6 pour avoir ma valeur exacte.
Le problème pourrait venir de ce morceau de code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 private function readMultipleRegistersPacketBuilder($unitId, $reference, $quantity){ $dataLen = 0; // build data section $buffer1 = ""; // build body $buffer2 = ""; $buffer2 .= iecType::iecBYTE(3); // FC 3 = 3(0x03) // build body - read section $buffer2 .= iecType::iecINT($reference); // refnumber = 12288 $buffer2 .= iecType::iecINT($quantity); // quantity $dataLen += 5; // build header $buffer3 = ''; $buffer3 .= iecType::iecINT(rand(0,65000)); // transaction ID $buffer3 .= iecType::iecINT(0); // protocol ID $buffer3 .= iecType::iecINT($dataLen + 1); // lenght $buffer3 .= iecType::iecBYTE($unitId); //unit ID // return packet string return $buffer3. $buffer2. $buffer1; } /** * readMultipleRegistersParser * * FC 3 response parser * * @param string $packet * @return array */ private function readMultipleRegistersParser($packet){ $data = array(); // check Response code $this->responseCode($packet); // get data for($i=0;$i<ord($packet[8]);$i++){ $data[$i] = ord($packet[9+$i]); } return $data; }J'ai essayé de changer des valeurs mais rien n'y fait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /** * iecBYTE * * Converts a value to IEC-1131 BYTE data type * * @param value value from 0 to 255 * @return value IEC BYTE data type * */ public static function iecBYTE($value) { return chr($value & 0xFF); } /** * iecINT * * Converts a value to IEC-1131 INT data type * * @param value value to be converted * @return value IEC-1131 INT data type * */ public static function iecINT($value) { return self::iecBYTE(($value >> 8) & 0x00FF) . self::iecBYTE(($value & 0x00FF));
Si vous avez une idée, je suis preneur.
Merci
Partager