An OPC Server provides data to an OPC Client application (such as an HMI, Historian, etc) using OPC. However, an OPC Server always uses a non-OPC method to exchange data with a PLC.
For example, suppose an OPC Server communicates with a PLC using the Modbus protocol. In this case, the OPC Server will ask the PLC for specific memory addresses that contain the data that the OPC Server requires. This is done using the Modbus protocol. The PLC provides all the responses to the OPC Server using Modbus as well. This way, the OPC Server can read data from, and write data to the PLC using Modbus. The OPC Server then converts the data it retrieves from the PLC (using Modbus), to OPC "format," and sends the data to an OPC Client application.
In every case, the OPC Server must know something very specific about the PLC to which it connects. At minimum, it needs to know the protocol/API spoken by the PLC. However, in most cases, the integrator needs to configure the OPC Server for the specific information the PLC contains, which will change from project to project. In every case, once the integrator configures the OPC Server properly, any OPC Client application can retrieve data from the OPC Server without having to know anything about the PLC or its configuration.