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
Sent: Friday, June 23, 2017 9:05 AM
To: [email protected]
Subject: modbus write 2 16 bits holding registers with modbus function 16
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:
epics> dbpf NOC02:CMD_TEST 45
DBR_DOUBLE: 45
epics> 2017/06/23 10:40:51.678 drvModbusAsyn::writeInt32 port NOC_F16 invalid request for Modbus function 16
2017/06/23 10:40:51.678 NOC02:CMD_TEST devAsynInt32 process error
This is the configuratión for the connection and record:
drvAsynIPPortConfigure("NOC02","192.168.1.1:502",0,1,1)
modbusInterposeConfig("NOC02",0,5000)
drvModbusAsynConfigure("NOC_F16", "NOC02", 1, 16, 2, 2, 6, 2000, "TTA")
record(longout,"NOC02:CMD_TEST") {
field(DTYP,"asynInt32")
field(OUT,"@asyn(NOC_F16 0)")
}
Any help would be appreciated.
Thanks in advance!