Skip to content

Commit 988dccf

Browse files
committed
[fixed] read_string & write_string function bug fixed
1 parent 525089f commit 988dccf

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

ab_plc_cip_net/ab_cip.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,22 +368,36 @@ cip_error_code_e ab_cip_write_double(int fd, const char* address, double val)
368368

369369
cip_error_code_e ab_cip_write_string(int fd, const char* address, int length, const char* val)
370370
{
371+
// this functio use Type Code: CIP_Type_Byte
372+
// NOT SUPPORT Type Code 0xDA
371373
cip_error_code_e ret = CIP_ERROR_CODE_FAILED;
372374
if (fd > 0 && address != NULL && val != NULL)
373375
{
374-
byte write_len = length + 1;
376+
// 1. write length is even
377+
byte write_len = length;
378+
if (write_len % 2 == 1)
379+
write_len += 1;
380+
375381
byte_array_info write_data = { 0 };
376382
write_data.data = (byte*)malloc(write_len);
377383
if (write_data.data != NULL)
378384
{
379385
memset(write_data.data, 0, write_len);
380-
memcpy(write_data.data, &write_len, 1);
381-
memcpy(write_data.data + 1, val, length);
386+
memcpy(write_data.data, val, length);
382387
write_data.length = write_len;
383388

389+
// 2. write length
384390
char temp_addr[100] = { 0 };
385391
sprintf(temp_addr, "%s.LEN", address);
386-
ret = write_value(fd, temp_addr, 1, CIP_Type_Byte, write_data);
392+
ret = ab_cip_write_int32(fd, temp_addr, length);
393+
394+
// 3. write data
395+
if (ret == CIP_ERROR_CODE_OK)
396+
{
397+
memset(temp_addr, 0, 100);
398+
sprintf(temp_addr, "%s.DATA[0]", address);
399+
ret = write_value(fd, temp_addr, 1, CIP_Type_Byte, write_data);
400+
}
387401
}
388402
else
389403
{

ab_plc_cip_net/main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ int main(int argc, char** argv)
143143

144144
//////////////////////////////////////////////////////////////////////////
145145
#if true
146+
// this function NEED TEST
146147
double w_d_val = 12345.6789;
148+
strcpy(address, "Double");
147149
ret = ab_cip_write_double(fd, address, w_d_val);
148150
printf("Write\t %s \tdouble:\t %lf, \tret: %d\n", address, w_d_val, ret);
149151
GET_RESULT(ret);
@@ -159,7 +161,7 @@ int main(int argc, char** argv)
159161
const char sz_write[] = "[email protected]";
160162
int length = strlen(sz_write);
161163
strcpy(address, "F");
162-
//ret = ab_cip_write_string(fd, address, length, sz_write);
164+
ret = ab_cip_write_string(fd, address, length, sz_write);
163165
printf("Write\t %s \tstring:\t %s, \tret: %d\n", address, sz_write, ret);
164166
GET_RESULT(ret);
165167

ab_plc_cip_net/typedef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ typedef enum _tag_cip_type
3838
CIP_Type_D2 = 0xD2, // Bit string, 16-bits, WORD
3939
CIP_Type_D3 = 0xD3, // Bit string, 32 bits, DWORD
4040
CIP_Type_D4 = 0xD4, // Bit string, 64 bits LWORD
41+
CIP_Type_DA = 0xDA, //
42+
4143
}cip_type_e;
4244

4345
#endif // !__H_TYPEDEF_H__

0 commit comments

Comments
 (0)