1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 <2017> 2018 2019 2020 2021 2022 2023 2024 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 <2017> 2018 2019 2020 2021 2022 2023 2024 |
<== Date ==> | <== Thread ==> |
---|
Subject: | RE: modbus write 2 16 bits holding registers with modbus function 16 |
From: | Mark Rivers <[email protected]> |
To: | 'Claudio Lambert' <[email protected]> |
Cc: | "[email protected]" <[email protected]> |
Date: | Fri, 23 Jun 2017 15:32:06 +0000 |
Hi Claudio, > I'm using modbusR2-1. OK, that explains the problem. That is a very old (2010) version, and you are trying to use features that are not available in that release. This is the relevant code from writeInt32: switch(pPlc->modbusFunction) { case MODBUS_WRITE_SINGLE_COIL: case MODBUS_WRITE_SINGLE_REGISTER: status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, modbusAddress, &data, 1); if (status != asynSuccess) return(status); break; default: asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, "%s::writeInt32 port %s invalid request for Modbus" " function %d\n", driver, pPlc->portName, pPlc->modbusFunction); return(asynError); } Note that writeInt32 does not support MODBUS_WRITE_MULTIPLE_REGISTERS in that release. You are also asking for data type 6=INT32_BE. But support for that data type was only added in R2-4, as documented in the release notes. I suggest you update to the latest version, R2-9. Mark From: Claudio Lambert [mailto:[email protected]]
Hi Mark, The OS where EPICS run is GNU/Linux x86_64 and the compiler is gcc 4.4.3. I made the correction in the noAutoConnect flag but the error persist.
Claudio. 2017-06-23 11:47 GMT-03:00 Mark Rivers <[email protected]>: Hi Claudio, I don't understand that error message. What version of the EPICS Modbus package are you using? In the latest version that error comes from this code starting at line 964 in drvModbusAsyn.c switch(pPlc->modbusFunction) { case MODBUS_WRITE_SINGLE_COIL: buffer[0] = value; status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, modbusAddress, buffer, 1); if (status != asynSuccess) return(status); break; case MODBUS_WRITE_SINGLE_REGISTER: status = writePlcInt(pPlc, dataType, offset, value, buffer, &bufferLen); if (status != asynSuccess) return(status); for (i=0; i<bufferLen; i++) { status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, modbusAddress+i, buffer+i, bufferLen); } if (status != asynSuccess) return(status); break; case MODBUS_WRITE_MULTIPLE_REGISTERS: case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: status = writePlcInt(pPlc, dataType, offset, value, buffer, &bufferLen); if (status != asynSuccess) return(status); status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, modbusAddress, buffer, bufferLen); if (status != asynSuccess) return(status); break; default: asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, "%s::writeInt32 port %s invalid request for Modbus" " function %d\n", driver, pPlc->portName, pPlc->modbusFunction); return asynError; } So the error comes when it falls through the switch into the default: block. However, it is reporting that pPlc->modbusFunction is 16, which is what MODBUS_WRITE_MULTIPLE_REGISTERS
is defined to be in modbus.h. #define MODBUS_WRITE_MULTIPLE_REGISTERS 0x10 So it should have executed the case block above the default: section, not the default section. What OS and compiler are you using? Also, I notice something about this command in your startup script: drvAsynIPPortConfigure("NOC02","192.168.1.1:502",0,1,1) You have set the noAutoConnect flag. This is generally not a good idea, I would suggest changing this line to: drvAsynIPPortConfigure("NOC02","192.168.1.1:502",0,0,1) However, I don't think this is related to the problem you are having. Mark From:
[email protected] [mailto:[email protected]]
On Behalf Of Claudio Lambert Hi all, I'm trying to write 2 x 16 bits holding registers (N, N+1) at same time, but I'm obtaining the following error: This is the configuratión for the connection and record:
|