A reentrant DLL must not use global variables. You are using the global variable C.
If your model contains two instances of your DLL, i1 and i2, the DLL is only loaded once. Therefore, there is only one instance of C.
You allocate memory to a Converter_struct for both instances i1 and i2 in plecsStart(). Now, as soon as the simulation starts, plecsStart() will be called for both instances i1 and i2 - but you cannot make any assumption for which instance it is called first. In any case, C will only point to the memory allocated in the last call to plecsStart().
During the simulation, plecsOutput() is called for both instances i1 and i2. Again, you can make no assumptions about which instance is called when. Since you use the global variable C directly, you will always work with the memory allocated in the last call to plecsStart(), regardless whether plecsOutput() is called for i1 or i2.
The solution is simple: Get rid of the global variable C. Instead, use a local variable declaration in both plecsStart() and plecsOutput(). In plecsOutput(), assign your local variable to the value of aState->userData, which you already used in plecsStart() to store a pointer to the memory that you allocated for C.